Java基礎18--泛型--工具類--JDK1.5新特性
18-1,泛型-概述
1,泛型是JDK1.5出現的新技術,新技術的出現是為了解決問題。
2,泛型可以用於明確一個集合中儲存什麼型別的元素
ArrayList<String> al = new ArrayList<String>(); al.add("abc");//正確 //al.add(3);//編譯直接報錯 //在迭代器上加上泛型,下面取出來的時候就不用強轉了 Iterator<String> it = al.iterator(); while(it.hasNext()) { //在這裡不用強轉了,因為從it中取出的肯定是String String str = it.next(); System.out.println(str); }
3,好處
(1)將執行時間的問題ClassCastException轉到了編譯時期。
(2)避免了強制轉換的麻煩。
4,泛型什麼時候用呢?
當操作的引用資料型別不確定的時候,就用泛型,將要操作的引用資料型別寫在<>中即可。其實<>就是一個用於接收具體引用資料型別的引數範圍。
在程式中,只要用到了帶有<>的型別或者介面,就要明確傳入的具體引用資料型別。
也可以同時接受多個數據型別:
class Tool<e1,e2,e3,e4> Tool<String,Demo,Person,Integer> t = new Tool<String,Demo,Person,Integer>();
18-2,泛型-擦除&補償
1,泛型解決了編譯時期的安全問題,是給編譯器使用的技術。
2,執行時,會將泛型去掉,生成的class檔案中是不帶有泛型的,這個稱為泛型的擦除。
為什麼要擦除呢?
因為為了相容執行時的類載入器,因為泛型是JDK1.5的新特性,如果class檔案中加上泛型的話,類載入器會不認識,若想要類載入器認識泛型,類載入器也要升級,為了避免升級類載入器的麻煩,泛型將交由編譯器處理,編譯通過後就會把他刪去,使之前的類載入器也能執行它。
3,泛型的補償:
擦除後,如果對元素進行取出的賦值動作,如:String str =it.next();是否需要加上強轉呢?答案是不用了,首先,加上泛型且編譯通過就能保證集合中的資料是指定的型別了,所以認為不會出現規定型別以外的元素。其實,在執行時,是自動添加了一步動作,通過用getClass()方法獲取元素的型別再對其進行一次轉換動作,就不用使用者在強制轉換了。
18-3,泛型-在集合中的應用
1,以TreeSet為例,TreeSet具備比較功能,但存入的型別必須實現Comparable介面並實現了裡面的compareTo方法才可以;或者定義一個比較器,實現Comparator介面並實現裡面的compare方法也可以。定義TreeSet時,如果不加泛型Eclipse等IDE會有黃色波浪線提示,加上泛型,黃色波浪線即可消失。
2,上一章提到的Person類實現Comparable介面時Comparable介面也需要指定泛型,如:Comparable<Person>,指定後,覆寫的compareTo方法中的引數就可以不寫Object了,直接寫Person就可以,方法體中的程式碼也不用強制向下轉型了。Comparator介面也要加上泛型,它裡面的compare方法的兩個引數也直接接受Person型別就可以了。例如:
class Person implements Comparable<Person> {
...code...
public int compareTo(Person p) {
//Person p = (Person)p;//強轉可以省去,因為定義了泛型
int temp = this.age = p.age;
return temp == 0 ? this.name.compareTo(p.name) : temp;
}
...code...
}
18-4,泛型類
1,以前定義工具類的時候這麼定義:
public class Tool {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
別的類用這個工具類的時候,可以這樣做:
Tool tool = new Tool();
/*
這裡因為沒有Worker這個類,所以是錯誤的。
Worker為傳入的錯誤值,但編譯不會報錯,因為Tool中接收的是Object型別,
下面的語句必須做強轉才能匹配型別,因為把Worker向上提升為了Object。
*/
tool.setObject(new Worker());
Student stu = (Student)tool.getObject();
工具類是針對所有型別的,而任何一個類都是Object的子類,所以根據多型的特性,通過將引數定義成Object我們就可以使這個方法接收所有型別的引數,在沒有泛型的時候我們就只能這麼做。
在JDK1.5之後,使用泛型來接收類中要操作的引用資料型別,這就是泛型類。
泛型類什麼時候用呢?
當類中的操作的引用資料型別不確定的時候,就是用泛型來表示。
例如:
public class Tool<Q> {
private Q q;
public Q getObect() {
return q;
}
public void setObject(Q object) {
this.q = object;
}
}
有泛型後,在別的類用到工具類的時候,可以這麼做:
Tool<Student> tool = new Tool<Student>();
//tool.setObject(new Worker());//編譯報錯,因為有了泛型指定的Student,所以別的不能進入集合。
tool.setObject(new Student());
Student stu = tool.getObject();
18-5,泛型方法
1,在18-4中有泛型的Tool類中加入泛型方法,Tool<QQ>
public class Tool<Q> {
private Q q;
public Q getObect() {
return q;
}
public void setObject(Q object) {
this.q = object;
}
/*
如果方法不加泛型會報錯,因為Tool明確只能接收QQ型別,
所以不能操作W型別,要想讓其中一個方法操作W型別,
必須在返回值型別前加上泛型<W>。
*/
public <W> void show(W str) {
System.out.println("show" + str.toString());
}
/*
另外,print接收的是字串,那麼能不能列印字串的長度呢?
答案是不能的,因為QQ str = "abc"(這裡假設傳入abc),將"abc"提升為QQ型別,
QQ型別不知道String型別中的特有方法length(),所以不能列印。但由於QQ也
繼承自Object,所以可以使用Object中的方法。
*/
public void print(QQ str) {
System.out.println("print" + str);
}
}
呼叫的時候:
Tool<String> tool = new Tool<String>();
tool.show(new Integer(4));//因為show加了泛型,所以可以接受Tool定義的String以外的型別。
tool.show("abc");//符合Tool的泛型。
tool.print("haha");//print方法沒有加泛型,直接匹配。
2,當方法靜態時,不能訪問類上定義的泛型,如果靜態方法是用泛型,只能將泛型定義在方法上。
如果在Tool<QQ>中定義方法:
//如果此方法上不加泛型,引數Y obj會編譯報錯,泛型需要物件來明確,
//如Tool<String> tool = new Tool<String>();靜態是不需要物件的,所以必須在void前加泛型。
public static <Y> void method(Y obj) {
System.out.println("method" + obj);
}
呼叫這個方法的時候:
Tool.method("bcd");//bcd
Tool.method(new Integer(9));//9
18-6,泛型介面
1,泛型介面就是將泛型定義在介面上。
//定義泛型時一般不明確具體型別,可以接受任意指定型別的物件,在建立物件的時候明確。
interface Inter<T> {
public void show(T t);
}
//實現介面可以明確要操作的型別,那麼在這個類上直接加上指定型別的泛型即可。
class ImterImpl<String> implements Inter<String> {
public void show(String str) {
System.out.println("show:" + str);
}
}
呼叫show方法時:
InterImpl in = new InterImpl();//這樣new物件時就不用加泛型了。
in.show("abc");//這樣呼叫就行
2,在實現介面的類中還是不能明確使用的型別:
class InterImpl<Q> implements Inter<Q> {
public void show(Q q) {
System.out.println("show:" + q);
}
}
在new這個InterImpl類的時候才能明確使用的型別,那麼就定義成上述的樣子,在new物件的時候再明確其泛型。
InterImpl<Integer> in = new InterImpl<Integer>();
in.show(5);
這樣一來,in物件就只能接收Integer型別的物件了。
18-7,泛型的界定-上限
1,有多個集合,要想用Iterator取出多個集合中的資料,這時不要定義多個Iterator,要提高程式碼的複用性,就要單獨定義一個方法來進行迭代。例如有這麼兩個集合:
ArrayList<String> al = newArrayList<String>();
ArrayList<Integer> al2 = newArrayList<Integer>();
假如這兩個集合中已經有了資料,這時要取出裡面的資料,定義一個迭代方法:
//這裡接收的是Collection,所以可以迭代List,Set等所有集合,但這裡也定義了泛型,所以只能接受String了。
public static void printCollection(Collection<String> al) {
Iterator<String> it = al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
這是要考慮到接收的集合中的元素型別是不確定的,怎樣接收不同型別的元素呢?可以用泛型萬用字元表示。
2,泛型的萬用字元---?,表示未知型別。
public static void printCollection(Collection<?> al) {
Iterator<?> it = al.iterator();
while(it.hasNext()) {
//由於引數型別不確定,所以直接用it.next()就OK了。
System.out.println(it.next());
}
}
也可以在方法上加上泛型:
public static <T> void printCollection(Collection<T> al)
Iterator<T> it = al.iterator();
while(it.hasNext()) {
T str = it.next();
System.out.println(str);
}
但是這麼做有些麻煩。但也有另外的好處,如果這麼寫:
public static <T> T printCollection(Collection<T> al) {
Iterator<T> it = al.iterator();
T t = it.next();
return t;
}
這樣就可以對傳入的T返回其物件,並進行操作,不過主要還是用萬用字元--?。
3,需求:迭代方法中,只能接收Person及其子類。
分析:首先?就不行了,因為不能接受所有物件。
例如Person的子類有Worker,Student,若要迭代這兩個而不能迭代Person以外的類(例如String),可以這麼寫:
//<? extends Person>表示泛型定義是所有繼承Person的型別或Person型別
public static void printCollection(Collection<? extends Person> al){
Iterator<? extends Person> it = al.iterator();
while(it.hasNext()) {
Person p = it.next();//已經可以明確接收的是Person或其子類
System.out.println(p.getName() + ":" + p.getAge());
}
}
若想用此方法迭代String型別的物件,則在編譯時會直接報錯,因為String不是Person的子類,這就是泛型的上限,其實,泛型寫<?>是<? extends Object>的縮略。
18-8,下限
1,定義方式:<? super E>表示指定的型別必須是E或E的父類。
例如Student和Worker都是Person的子類,
定義了三個集合:
ArrayList<Person> al1 = new ArrayList<Person>();
ArrayList<Student> al2 = new ArrayList<Student>();
ArrayList<Worker> al3 = new ArrayList<Worker>();
然後定義一個方法:
public static void printCollection(Collection<? super Student> al) {
Iterator<? super Student> it = al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
這時一個迭代集合元素的方法,泛型型別指的是Student或Student的父類,由於Student繼承自Person,Worker也繼承自Person,所以這裡如果傳入Worker是不行的,會報錯。這就是泛型的下限。
18-9,選擇使用集合的技巧
1,幾何元素需要唯一麼?
|--需要:用Set
|--需要指定順序麼?
|--需要:TreeSet
|--不需要:HashSet
|--但是想要一個和儲存一致的順序(有序):LinkedHashSet
|--不需要:用List
|--需要頻繁增刪麼?
|--需要:LinkedList
|--不需要:ArrayList
2,如何記住每個容器的結構和所屬的體系呢?看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
字尾名就是該集合所屬的體系。
字首名就是該集合的資料結構。
看到array:就要想到陣列,查詢快,有角標。
看到Link:就要想到連結串列,增刪快,想到add、get、remove方法。
看到hash:就要想到雜湊表,唯一性,就要想到元素需要覆蓋hashCode和equals方法。
看到tree:就要想到二叉樹,想到需要排序,兩個介面,Comparable,Comparator。
而且通常這些常用的集合容器都是不同步的。
18-10,工具類-Collections排序
1,java.util.Collections
此類完全由在Collection上進行操作或返回Collection的靜態方法組成。
2,Collections是集合框架的工作類,裡面的方法都是靜態的。
static <T extendsComparable<? super T>> voidsort(List<T> list)
根據元素的自然排序,對指定列表進行升序排序,列表中的所有元素都必須實現Comparable介面,列表中的所有元素都必須是相互可以比較的,即型別必須相互匹配才行。
演示排序方法示例:
public static void demo_1() {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
System.out.println(list);
//排序
Collections.sort(list);//String實現了Comparable介面,具備可比性
System.out.println(list);
}
若要按照長度排序,可以通過sort(List<T>list,Comparator<? Super T> c)帶比較器的sort方法實現,這需要定義一個類,並實現Comparator介面,並實現裡面的compare方法。例如:
public class ComparatorByLength implements Comarator<String> {
public int compare(String o1,String o2) {
int temp = o1.length() - o2.length();
return temp == 0 ? o1.compareTo(o2) : temp;
}
}
然後呼叫方法Collections.sort(list,newComparatorByLength());即可。
18-11,折半&最值
1,static <T> int binarySearch(List<?extends Comparable<? super T>> list, T key)
這個方法是使用二進位制搜尋法來搜尋指定列表,以獲得指定物件,在進行此呼叫之前,必須根據列表元素的自然順序對列表進行升序排序,其實就是二分查詢法。
2,static <T> int binarySearch(List<?extends T> list,T key,Comparator<? super T> c)
與上面的方法的不同之處在於,用指定的比較器對集合中的元素進行升序排序。
3,折半:
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
//排序
Collections.sort(list);
int index = Collections.binarySearch(list,"cba");//index是2
}
}
4,最大值
static T max(Collection<? extendsT> coll)
根據元素的自然順序,返回給定collection的最大元素,collection中的元素必須具備比較功能,該方法是依據Comparable比較的。
static T max(Collection<? extendsT> coll,Comparator<? super T> comp)
根據指定的比較器產生的順序,返回給定collection的最大值。
例如:
String max = Collections.max(list,newComparatorByLength())
返回最長的字串。
18-12,逆序&替換
1,static <T> Comparator<T>reverseOrder()
返回一個比較器,它強行反轉實現Comparable介面那些物件collection上的自然順序,他是根據Comparable比較的。
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(newComparatorByLength()))
這個方法強行反轉比較器指定排序後的反轉。
2,替換
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
//將list集合中的"cba"替換成"nba"
//原理:list.set(indexOf("cba"),"nba")
Collections.replaceAll(list,"cba","nba");
}
}
18-13,其他方法,將非同步集合轉成同步集合的方法
1,fill方法,可將集合中的所有的值都重新賦值(重新初始化)
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
Collections.fill(list, "cc");
System.out.println(list);//[cc,cc,cc] 將所有元素初始化為cc
}
}
2,Collections.shuffle(list);//將集合中的元素隨機重新排列
3,static <T> ArrayList<T>list(Enumeration<T> e)
返回一個數組列表,它按返回順序包含指定列舉返回的元素,將列舉轉換成ArrayList。
4,static <T> Enumeration<T>enumeration(Collection<T> c)
將指定集合轉成列舉。
5,static <T> Enumeration<T>synchronizedList(List<T> list)
返回指定列表支援的(執行緒安全的)列表。
除此之外可以將Collection、Map、Set,等轉成執行緒安全的。
實現原理:
List list = new ArrayList();//是非同步的
list = MyCollections.synList(list);//返回一個同步的list
給非同步的集合加鎖:
//保證在新增時不能刪除,刪除時不能新增
class MyCollections {
public static List synList(List list) {
return new MyList(list);
}
private class MyList implements List {
private List list;
private static final Object lock = new Object();
MyList(List list) {
this.list = list;
}
public boolean add(Object obj) {
synchronized(lock) {
return list.add(obj);
}
}
public boolean remove(Object obj) {
synchronized(lock) {
return list.remove(obj);
}
}
}
}
18-14,Arrays陣列工具類方法介紹
1,binarySearch(...)二分查詢法,返回索引。
2,equals(...)覆寫了Object中的equals,比較內容是否相同,即長度相同且對應位上的元素相同。
3,static void fill(byte[] a,byte val)將val賦給byte[]中的每一個位置。
4,sort(...)將傳入的陣列排序。
5,toString(),覆寫了Object中的toString(),直接列印陣列中的元素。
6,toString()的經典實現:
public static String myToString(int[] a) {
int iMax = a.length - 1;
if(iMax == -1) {
return "[]";
}
StringBuilder b = new StringBuilder();
b.append('[');
for(int i=0;;i++) {
b.append(a[i]);
if(i == iMax) {
return b.append(']').toString();
}
b.append(",");
}
}
18-15,Arrays-asList方法
1,static<T> List<T> asList(T... a)
返回一個受指定陣列支援的固定大小的列表。
用asList的原因:Arrays中提供的方法也是相當有限的,如果把陣列轉換成集合操作就方便多了,比如判斷一個元素是否在陣列中,Arrays中沒有這個方法,就需要自己寫一個判斷方法,但是如果將這個陣列轉換成List就可以直接用contains判斷了。
2,好處:可以使用集合中的方法運算元組中的元素。
注意:陣列的長度是固定的,所以對於集合的增刪方法是不能使用的,否則會發生UnsupportedOperationException異常,只要不改變集合長度的方法都可以使用。
但是可以使用set方法用指定元素替換指定的元素。
3,如果陣列中的元素是物件,那麼轉成集合時,直接將陣列中的元素作為集合中的元素進行儲存。如果陣列中的資料是基本資料型別,那麼會將該陣列作為集合中的元素進行儲存。
例如:
int[] arr = {31,11,51,61};
List<int[]> list =Arrays.asList(arr);
System.out.prtinln(list);//[[[email protected]
這時list集合的長度是1,列印結果是列印陣列物件。
但是如果定義一個Integer型別陣列,即非基本資料型別陣列:
Integer[] arr = {31,11,51,61};
List<int[]> list =Arrays.asList(arr);
System.out.println(list);//列印[31,11,51,61]
說明,如果存入非基本資料型別資料,列印的是每個物件的toString()。
18-16,Collection-->toArray方法
1,如何將集合轉化成陣列呢?
使用的是Collection介面中的toArray方法。
2,集合轉成陣列:可以對集合中的元素操作的方法進行限定,不允許對其進行增刪。
3,toArray方法需要傳入一個指定型別的陣列。
長度該如何定義呢?
如果長度小於集合的size,那麼該方法會建立一個同類型並和集合相同size的陣列。
如果長度大於集合的size,那麼該方法就會使用指定的陣列,儲存集合的元素,其他位置預設為null。
所以建議,最好將長度指定為集合的size。
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
String[] arr = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(arr));
18-17,JDK1.5新特性-ForEach迴圈
1,Collection的父介面是Iterable介面,該介面中只有一個iterator迭代器方法,在JDK1.5才出現,因為以後還有可能出現像Collection的頂層父類,都希望他們具備迭代功能,所以抽取出來,提高了擴充套件性。
2,ForEach迴圈,增強For迴圈
格式:for(型別 變數 :Collection集合或陣列){...}
傳統for和高階for的區別:
(1)傳統for可以完成對語句執行很多次,因為可以定義控制迴圈的增量和條件。
(2)高階for是一種簡化形式,它必須有被遍歷的目標。該目標要麼是陣列,要麼是Collection單列集合。
對陣列的遍歷如果僅僅是獲取陣列中的元素,可以使用高階for。
如果要對陣列的角標進行操作建議使用傳統for。
可以使用高階for遍歷map集合麼?
不能直接用,但是可以將map轉換成單列的set就可以使用了。
4,例項:
public class Demo1 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
for(String s : list) {//簡化了書寫,底層其實是iterator
System.out.println(s);
}
}
}
public class Demo2 {
public static void main(String[] args) {
int[] arr = {3,1,5,7,4};
for(int i : arr) {
System.out.println(i);
}
}
}
遍歷Map示例:
public class Demo3 {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(3,"zhangsan");
map.put(1,"wangyi");
map.put(5,"wangcai");
map.put(7,"xiaoqiang");
for(Integer key : map.keySet()) {
String value = map.getKey();
System.out.println(key + "::" + value);
}
for(Map.Entry<Integer,String> me : map.entrySet()) {
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key + ":" + value);
}
}
}
18-18,JDK1.5新特性-函式的可變引數
1,其實就是一個數組,但是接收的是陣列的元素。自動將這些元素封裝成陣列。簡化了呼叫者的書寫。
注意:可變引數型別,必須定義在引數列表的結尾。
public static newAdd(int... arr) {
int sum = 0;
for(int i=0;i<arr.length;i++) {
sum += arr[i];
}
return sum;
}
int sum = newAdd(5,1,7,4,3,6);//可以傳入任意長度的引數
System.out.println(sum);
int sum = newAdd(7,4,6,5,1,8,97,6);
System.out.println(sum);
注意:
public static newAdd(int... arr,int a)
{ ... code ...} //寫法錯誤,傳入的引數會全都賦給arr,a會沒有值
public static newAdd(int a,int... arr)
{ ... code ...} //寫法正確,第一個值傳給a,後面的傳給arr
18-19,JDK1.5新特新-靜態匯入
靜態匯入,其實匯入的類中的靜態成員。
在import後面加上static,示例如下:
import java.util.ArrayList;
import java.util.Collections;
import static java.util.Collections.*;//匯入Collections中的所有的靜態成員,可簡化書寫
import static java.lang.System.*;//匯入System中的所有靜態成員
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc3");
list.add("abc7");
list.add("abc1");
out.println(list);//out是System類中的靜態成員,靜態匯入System後,就不用通過System呼叫了
sort(list);//Collections中的靜態方法
out.println(list);
String max = max(list);//Collections中的靜態方法
out.println("max = " + max);
}
}
相關推薦
Java基礎18--泛型--工具類--JDK1.5新特性
18-1,泛型-概述 1,泛型是JDK1.5出現的新技術,新技術的出現是為了解決問題。 2,泛型可以用於明確一個集合中儲存什麼型別的元素 ArrayList<String> al = new ArrayList<String>(); al.add("
java基礎總結 -- 泛型 在類、介面、方法、匿名類、元組等使用 堆疊例子 商店模型
為什麼使用泛型: 在面向物件程式語言中,多型算是一種泛化機制。例如,你可以將方法的引數型別設為基類,那麼 該方法就可以接受從這個基類中匯出的任何類作為引數,這樣的方法更通用一些,可應用的地方也多一點。 在類的內部也是如此,凡是能夠使用基類,確實是能夠具備更好
java(List或Array陣列)求交集、並集、差集, 泛型工具類
業務需要求不同型別的交集、並集、差集為避免程式碼冗餘編寫工具類。 注:list 轉陣列需傳入陣列,如果將原陣列傳入將會改變原陣列的值,同時泛型陣列又不可以例項化,解決方案:Arrays.copyOf(n,list.size()) ,使用copyOf功能,開闢返回集合的等長新陣列,避免修改原陣列。
Java基礎Demo -- 泛型類的示例
泛型類 public class MyClass<T>{} 的簡單入門示例 /** * 泛型類 class MyClass<T>{} */ class MyGen<T> { private T t; public void setValue(T t){
Java基礎:泛型
ret 原來 不能 使用 自定義泛型 編程 讀取數組 yum 實現 同樣是面試當中遇到的問題,在平常寫代碼的過程當中,經常有使用到泛型編程,比如用到的各種集合方式,如Arraylist、hashmap、List、等,都有使用到泛型。但是當面試官讓自己系統的介紹一下泛型編
Java基礎學習——泛型
() logs 調用 自定義 sta class string [] lis 一、泛型方法 1 /** 2 3 自定義泛型:自定義泛型可以理解為是一個數據類型的占位符,或者理解為是一個數據類型的變量。 4 5 泛型方法: 6 泛型方法的自定義格式:修飾符&
14. Java基礎之泛型
remove 角度 分享 The 兩個 -a 類型形參 建議 set 引用自:https://www.cnblogs.com/lwbqqyumidi/p/3837629.html , https://blog.csdn.net/s10461/article/details/
java基礎——3——泛型+異常+IO
在Java釋出的JDK1.5版本中增加了泛型支援,所謂的泛型就是為了讓集合在很大程度上記住元素的資料型別。在沒有使用泛型之前,一旦把物件存放進Java集合中,集合只會將元素作為Object物件進行處理。當從集合中取出物件時就需要進行強制型別轉換。如果轉換錯誤,則將會引起ClassCastEx
java基礎-04泛型
介紹 泛型就是資料型別的引數化表示,泛型的本質是引數化型別,常用E代表任何資料型別,在實際使用的時候把實際的資料型別傳遞給E。 泛型的好處是設計通用的功能,多個數據型別可以共用。 泛型型別E只能代表Object型別,不能代表 int,double等基本型別,要使用Integer,Double代
Java基礎Demo -- 泛型上界的示例
<T extends SuperClass> 泛型上界的定義 <? extends SuperClass> 有界萬用字元的運用 普通泛型方法的運用 靜態泛型方法的運用 class Grandpa { private int x,y; public Gran
Java基礎Demo -- 泛型介面的示例
泛型介面 public interface MyInterface<T>{} 的簡單入門示例 /** * 類實現了一個泛型介面,並擴容下 */ interface AI<T> { void sss(T t); } class BI<T,K> imple
java基礎總結 --- 泛型 擦除、邊界、萬用字元、
* 擦除的問題 * 為什麼要擦除: 1.5版本才出現泛型 為了相容之前地程式碼 * 它使得泛化的客戶端可以用非泛化的類庫來使用。 * 以及不破壞現有類庫的情況下,將泛型融入java語言。 * 擦除使得現有的非泛型客戶端程式碼能夠在不改變的情況繼續使用,直至客戶端準
【Java基礎】泛型記錄概要
泛型記錄概要 泛型出現重要原因之一:創造容器類 泛型主要目的之一:指定容器持有什麼型別的物件,保證編譯的正確性 泛型簡單例項 class GenericsClass<T>{ private T property; public
Java基礎學習——泛型(generics)二
萬用字元(Wildcard) 考慮一個列印集合內所有元素的問題。下面這個可能是在Java舊版本中的寫法: void printCollection(Collection c) { Iterator i = c.iterator(); fo
Java基礎學習——泛型(generics)學習一
概述 在JDK 5.0,Java語言引入了好幾個新的功能,其中很重要的一個就是泛型(generics)。 本文就是對泛型的一個概述。你可以很熟悉其他語言中的類似結構,比如C++裡的模板(templates)。如果這樣,你將會看到兩者之間有相似,同時也有很大的
java基礎(28)--泛型與型別擦除、泛型與繼承
【泛型與型別擦除】 泛型是JDK 1.5的一項新特性,它的本質是引數化型別(Parameterized Type)的應用,也就是說所操作的資料型別被指定為一個引數。這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面和泛型方法。 泛
JAVA基礎之泛型與集合
一:泛型: 泛型類的定義格式: class class-name <type -parma-list>{} 例項化泛型類的格式: class-name<type-parma-list> obj = new class-name<type
JAVA基礎知識|泛型
一、什麼是泛型? 泛型,即“引數化型別”。 比如定義一個變數A,我們可以通過如下方式將這個變數定義為字串型別或者整形。 S
Java基礎-----jdk1.5新特性(靜態匯入,增強for迴圈,列舉)
package cn.itcast.jdk15; /* Jdk1.5新特性之-----靜態匯入 靜態匯入的作用:簡化書寫。 靜態匯入可以作用於一個類的所有成員 靜態沒匯入的格式:
黑馬程式設計師---java基礎加強---jdk1.5新特性之註解
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ----------- 註解(Annotation ) 是JDK 1.5 的新特性,現已應用於Spring , EJB ,JPA... 使用註解是一種趨勢。它可以用於建立