一诵次、泛型方法
1师倔、聲明語(yǔ)法
傳遞方法的泛型參數(shù):調(diào)用的時(shí)候傳遞泛型參數(shù)
變量.< 實(shí)際的泛型類型>方法名();
方法中聲明的泛型只能在當(dāng)前方法中使用
類聲明的泛型在整個(gè)類中都能用
每次調(diào)用方法都可以確定不一樣的類型
二西傀、聲明受限制的泛型
受限泛型類
class 類名< T extends 類型>
{
}
受限泛型方法
public < T extends 類型> 返回值 方法名稱(){
}
傳遞泛型參數(shù)的時(shí)候T必須是父類型或者是它的子類型
三酪术、泛型通配符
在聲明范型類的變量時(shí)可以使用通配符惩妇,在創(chuàng)建對(duì)象中不可以使用通配符普筹。
1恤磷、聲明的時(shí)候直接寫面哼?
2、使用通配符限制上界:<? extends 上界類型>
示例: 右邊的<>中的類型必須是Number或者Number的子類型
List<? extends Number> list=new ArrayList();
List<? extends Object> list=new ArrayList();
不可以調(diào)用傳遞范型參數(shù)的方法扫步。
調(diào)用帶泛型返回值的方法魔策,返回值按照上界類型對(duì)待
在聲明變量的時(shí)候使用,可以對(duì)該變量接收的對(duì)象的類型中的泛型信息做一些限制,但是又有一定靈活性
3河胎、<? super 下界類型>
右邊的<>中的類型必須是Number或者Number的父類型或者實(shí)現(xiàn)的接口類型
可以調(diào)用傳遞范型參數(shù)的方法,參數(shù)按照下界類型來(lái)對(duì)待了
調(diào)用帶泛型返回值的方法闯袒,返回值全部按照Object對(duì)待了
四、泛型擦除
1游岳、概念 Java的泛型是偽泛型政敢,這是因?yàn)镴ava在編譯期間,類中聲明的胚迫、接口中聲明的喷户、方法中聲明的所
有的泛型信息都會(huì)被擦掉,在這些類生成的字節(jié)碼文件中的正文中是不包含泛型信息访锻,這個(gè)過程成為泛
型擦除褪尝,泛型擦除之后闹获,原來(lái)在源文件中使用泛型類型的地方在字節(jié)碼文件中會(huì)替換為Object,如果聲
明的時(shí)候聲明的受限制的泛型河哑,那么字節(jié)碼文件中會(huì)替換為限制類型避诽。
2、泛型擦除的時(shí)間點(diǎn):發(fā)生在編譯期間
編譯器首先檢查類型安全—————————》進(jìn)行編譯擦除泛型信息———————-》字節(jié)碼文件中
就沒有泛型信息(Object)
3璃谨、泛型擦除的一些問題
1)因?yàn)榇嬖诜盒筒脸陈苑瓷錂C(jī)制可以破壞泛型的特性。睬罗,比如創(chuàng)建Person類型對(duì)象的時(shí)候確定了
Person類的T為String.,使用反射機(jī)制調(diào)用setPersonId方法缺可以放置其它類型轨功,因?yàn)樽止?jié)碼文件中的
setPersonId方法的參數(shù)為Object類型
2)因?yàn)榇嬖诜盒筒脸苑椒ㄖ貙懙臅r(shí)候會(huì)有沖突容达,但是JAVA語(yǔ)言已經(jīng)想辦法解決這個(gè)沖突古涧,就是
使用橋方會(huì)在子類或者實(shí)現(xiàn)類的字節(jié)碼文件中生成一個(gè)和父類同名同參的橋方法,在此橋方法中花盐,調(diào)用
了我們自己在源文件中重寫的方法
3)傳遞泛型參數(shù)的時(shí)候不能傳遞八中基本數(shù)據(jù)類型
4)Instanceof運(yùn)算符后面的類型不能傳遞泛型參數(shù)羡滑,只能寫原始類型、
五算芯、泛型使用注意事項(xiàng)
1柒昏、不能將靜態(tài)屬性聲明為泛型類型
2、不能在靜態(tài)方法中使用類聲明的泛型類型
3熙揍、不能創(chuàng)建泛型數(shù)組:new T[10],寫法錯(cuò)誤
4职祷、使用Instanceof運(yùn)算符比較的時(shí)候,類型不能包含泛型信息届囚,因?yàn)橛蟹盒筒脸?/p>
5有梆、傳遞泛型參數(shù)的時(shí)候不能使用8種基本數(shù)據(jù)類型
六、層次結(jié)構(gòu)
1意系、Collection:以單個(gè)元素為單位進(jìn)行存放
List:有序集合泥耀,每個(gè)元素都有一個(gè)和存入順序吻合的索引編號(hào),并且蛔添,我們可以依靠位置編號(hào)對(duì)
集合中的元素進(jìn)行操作
ArrayList:實(shí)現(xiàn)類
LinkedList
Vector
Set:無(wú)序集合痰催,每個(gè)元素沒有位置編號(hào),程序員也不能用位置編號(hào)對(duì)集合中的元素進(jìn)行操作迎瞧,不
能存入重復(fù)值
HashSet
LinkedHashSet
TreeSet
2夸溶、Map:以鍵值對(duì)為單位進(jìn)行存放HashMap
LinkedHashMap
TreeMap
Hashtable
七、Collection
存放若干個(gè)獨(dú)立元素
增加操作
?boolean add(Object element) :增加一個(gè)元素
?boolean addAll(Collection collection) :將集合中的所有元素進(jìn)行增加
移除操作
?boolean remove(Object element) :移除一個(gè)元素凶硅,依靠equals方法進(jìn)行 比對(duì)蜘醋。注意。你的元素類型
有沒有重寫equals方法咏尝,如果有重寫压语,那就調(diào)用重寫過的equals啸罢,沒有重寫,調(diào)用Object類的equals
void clear() :清空所有元素
?void removeAll(Collection collection):將在集合中的元素移除胎食, 依靠equals方法進(jìn)行 比對(duì)
?void retainAll(Collection collection) :將不在集合中的元素移除扰才, 依靠equals方法進(jìn)行 比對(duì)
查詢操作:
?int size() :集合實(shí)際元素的個(gè)數(shù)
?boolean isEmpty() :判斷集合是否為空
?boolean contains(Object element) :判斷集合中有沒有包含一個(gè)元素
?boolean containsAll(Collection collection) :判斷集合中有沒有包含另一個(gè)集合中的元素
?Iterator iterator() :得到迭代器
八、List
數(shù)據(jù)結(jié)構(gòu):
邏輯存儲(chǔ)結(jié)構(gòu)
????線性的:每個(gè)元素有0或者1個(gè)前驅(qū)元素厕怜,有0個(gè)或者1個(gè)后繼元素
????樹結(jié)構(gòu):每個(gè)元素有一個(gè)或0個(gè)前驅(qū)元素衩匣,有0個(gè)多個(gè)后繼元素
????圖結(jié)構(gòu):每個(gè)元素有多個(gè)或0個(gè)前驅(qū)元素,有0個(gè)多個(gè)后繼元素
物理存儲(chǔ)結(jié)構(gòu)
????線性存儲(chǔ):元素在內(nèi)存中是連續(xù)存放的
????鏈?zhǔn)酱鎯?chǔ):元素在內(nèi)存中不是連續(xù)存放的
List: 有序集合粥航,可以放入重復(fù)(equals進(jìn)行判斷)元素琅捏,會(huì)按照存入的順序給每個(gè)元素編號(hào),遍歷的
時(shí)候也可以依靠編號(hào)進(jìn)行遍歷
示例:
1递雀、ArrayList
常用API
????構(gòu)造方法
底層:底層是一個(gè)Object類型的數(shù)組柄延,初始的默認(rèn)長(zhǎng)度10,也可以指定長(zhǎng)度缀程,初始長(zhǎng)度如果滿了搜吧,
底層進(jìn)行自動(dòng)擴(kuò)容,擴(kuò)容為原來(lái)的1.5倍oldCapacity + (oldCapacity >> 1)杨凑。10—->15—->22滤奈,如
果對(duì)集合中的元素個(gè)數(shù)可以預(yù)估,那么建議預(yù)先指定一個(gè)合適的初始容量,可以減少擴(kuò)容的次數(shù)
List l =new ArrayList();
線程不安全撩满,性能高蜒程。
優(yōu)點(diǎn):查找效率高,向末尾添加伺帘、刪除元素也可以
缺點(diǎn):增加 昭躺、刪除牽扯到數(shù)組的擴(kuò)容和移動(dòng),效率低
2曼追、LinkedList:
常用API:
構(gòu)造方法
LinkedList():無(wú)參數(shù)
LinkedList(Collection c):帶集合類型的參數(shù)
其他方法(實(shí)現(xiàn)類獨(dú)有的方法)
????addFirst:給鏈表頭添加元素
????addLast:給鏈表末尾添加元素
底層是一個(gè)鏈表(雙向)結(jié)構(gòu)窍仰,添加的元素和前后元素的地址信息會(huì)封裝成一個(gè)Node類型的對(duì)
象汉规,放到集合中礼殊,不是線性存儲(chǔ),內(nèi)存中是鏈?zhǔn)酱鎯?chǔ)针史,不連續(xù)的空間晶伦。
優(yōu)點(diǎn):增加、刪除效率高
缺點(diǎn):查找效率低