* Iterable
迭代器接口梗摇,是Collection類的父接口勺届。
實現(xiàn)這個Iterable接口的對象允許使用foreach進(jìn)行遍歷斗锭。
這個Iterable接口只有一個方法: iterator()由桌。它返回一個代表當(dāng)前集合對象的泛型<T>迭代器,用于遍歷操作帆谍。
一伪朽、Collection:
最基本的集合接口,它不提供直接的實現(xiàn)汛蝙。
實現(xiàn)了 Collection 接口的類都必須提供兩套標(biāo)準(zhǔn)的構(gòu)造函數(shù)烈涮,一個是無參,用于創(chuàng)建一個空的 Collection患雇,一個是帶有 Collection 參數(shù)的有參構(gòu)造函數(shù)跃脊,用于創(chuàng)建一個新的 Collection,這個新的 Collection 與傳入進(jìn)來的 Collection 具備相同的元素苛吱。
1、 List:
有序可重復(fù)器瘪;
允許元素為null翠储;
另外還提供一個 listIterator()方法绘雁,返回一個 ListIterator 接口,和標(biāo)準(zhǔn)的 Iterator 接口相比援所,ListIterator 多了一些 add()之類的方法庐舟,允許添加,刪除住拭,設(shè)定元素挪略, 還能向前或向后遍歷;
1.1 ArrayList:
查詢速度快滔岳,適合隨機(jī)訪問杠娱;
內(nèi)部結(jié)構(gòu)是數(shù)組;
初始容量是10谱煤;
存放有序摊求,元素可以重復(fù)也可以為null;
插入和刪除的移動速度慢刘离;動態(tài)擴(kuò)容1.5倍室叉;
線程不安全;1.2 LinkedList:
增刪速度快硫惕,涉及增刪頻繁的數(shù)據(jù)茧痕;
內(nèi)部結(jié)構(gòu)是雙向鏈表;
元素存放有序恼除,允許元素為null凿渊,可重復(fù);
線程不安全;
實現(xiàn)了Queue接口缚柳、Deque接口埃脏,即能將LinkedList當(dāng)作隊列或雙端隊列使用,也可以被當(dāng)作"棧"來使用秋忙。接口窄化了對LinkedList的方法的訪問權(quán)限(如Queue<String> queue = new LinkedList<String>();只能訪問Queue接口所定義的方法 了彩掐,而不能直接訪問 LinkedList的非Queue的方法);1.3 Vector :
操作與ArrayList相似灰追;
與ArrayList區(qū)別:線程安全堵幽;1.4 Stack
繼承自 Vector,后進(jìn)先出弹澎;
Stack 提供 5 個額外的方法使得 Vector 得以被當(dāng)作堆棧使用: push 和 pop 方法朴下, peek 方法得到棧頂?shù)脑兀琫mpty 方法測試堆棧是否為空苦蒿,search 方法檢測一個元素在堆棧中的位置殴胧;
Stack 剛創(chuàng)建后是空棧;
2、 Set:
不允許重復(fù)元素团滥,實現(xiàn)原理是基于Map竿屹,Set利用Map中“鍵”不能重復(fù)的特性實現(xiàn),java是先實現(xiàn)了Map灸姊,然后通過包裝了一個所有value都為null的Map就實現(xiàn)了Set集合拱燃;
Set判斷兩個對象相同不是使用"=="運算符,而是根據(jù)equals方法力惯。equals()決定是否可以加入HashSet碗誉、而hashCode()決定存放的位置,它們兩者必須同時滿足才能允許一個新元素加入HashSet父晶。
如果兩個對象的hashCode相同哮缺,但是它們的equlas返回值不同,HashSet會在這個位置用鏈?zhǔn)浇Y(jié)構(gòu)來保存多個對象诱建。而HashSet訪問集合元素時也是根據(jù)元素的HashCode值來快速定位的蝴蜓,這種鏈?zhǔn)浇Y(jié)構(gòu)會導(dǎo)致性能下降。
如果需要把某個類的對象保存到HashSet集合中俺猿,我們在重寫這個類的equlas()方法和hashCode()方法時茎匠,應(yīng)該盡量保證兩個對象通過equals()方法比較返回true時,它們的hashCode()方法返回值也相等
2.1 HashSet:
底層實現(xiàn)是HashMap(),不允許重復(fù)元素(key)押袍;
存放無序(根據(jù)hash確定索引位置)诵冒;
存取速度比較快;
允許元素為null(最多只能有一個null元素)谊惭;
HashSet集合判斷兩個元素相等的標(biāo)準(zhǔn)是兩個對象通過equals()方法比較相等汽馋,并且兩個對象的hashCode()方法的返回值相等;2.2 LinkedHashSet:
繼承HashSet圈盔,跟HashSet類似豹芯,唯一區(qū)別:存放元素有序,當(dāng)遍歷LinkedHashSet集合里的元素時驱敲,LinkedHashSet將會按元素的添加順序來訪問集合里的元素铁蹈;
遍歷性能比HashSet好,但插入刪除的性能會差點众眨;
允許元素為null(最多只能有一個null元素)握牧;2.3 TreeSet:(HashSet的整體性能總比TreeSet好,特別是添加和查詢操作娩梨,只有當(dāng)一個保持排序的Set時才使用TreeSet)
TreeSet是SortedSet接口的實現(xiàn)類沿腰;
以紅黑樹的形式存儲集合元素;
是SortedSet接口的唯一實現(xiàn)類狈定;
不允許元素重復(fù)颂龙, 不允許元素為null;
自動排序元素;
3厘托、Queue:
先進(jìn)先出
二友雳、Map:
以Key-Value鍵值對存在稿湿,key不允許重復(fù)铅匹;
Map中包括一個內(nèi)部類:Entry。該類封裝了一個key-value對饺藤,Entry包含三個方法:
Object getkey():返回該Entry里包含的key值包斑。
Object getValue():返回該Entry里包含的value值。
Object setValue():設(shè)置該Entry里包含的value值涕俗,并返回新設(shè)置的value值罗丰。
Map一般很少輸出,一般作為查詢使用再姑,如果要迭代萌抵,必須聲明一個類型為Map.Entry的Set接口,接收map.entrySet()元镀,然后用Set 的Iteractor遍歷(或foreach遍歷Set集合)绍填,getKey()得到key,getValue()得到value
- HashMap:(適用于在Map中插入、刪除和定位元素)
數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)和鏈表實現(xiàn)的栖疑。Entry[] table+鏈表存儲來解決hash沖突讨永;
允許key和value為null,key重復(fù)會覆蓋遇革;
存放無序卿闹;
線程不安全;
Hashmap實現(xiàn)請看jdk8 hashmap
LinkedHashMap:(需要維護(hù)元素的插入順序萝快,因此性能略低于HashMap的性能锻霎,但在迭代訪問Map里的全部元素時將有很好的性能,因為它以鏈表來維護(hù)內(nèi)部順序揪漩,同時又可避免使用TreeMap所增加的成本)
HashMap子類旋恼;
數(shù)據(jù)結(jié)構(gòu)是雙向鏈表;
存放元素有序(鏈表定義了迭代順序氢拥,該迭代順序與key-value對的插入順序保持一致)蚌铜;
線程不安全;-
TreeMap:(適用于按自然順序或自定義順序遍歷鍵(key)嫩海,HashMap通常比TreeMap快一點(樹和哈希表的數(shù)據(jù)結(jié)構(gòu)使然)冬殃,在需要排序的Map時候才用TreeMap.)
不允許Key為null, value可以為null;
有序;
線程不安全;
速度慢叁怪;TreeMap兩種排序方法:
自然排序:TreeMap的所有key必須實現(xiàn)Comparable接口审葬,而且所有key應(yīng)該是同一個類的對象,否則將會拋出ClassCastExcepiton異常。定制排序:創(chuàng)建TreeMap時涣觉,傳入一個Comparator對象痴荐,該對象負(fù)責(zé)對TreeMap中所有key進(jìn)行排序。采用定制排序時不要求Map的key實現(xiàn)Comparable接口官册。
-
WeakHashMap
WeakHashMap與HashMap的用法基本相似生兆。區(qū)別在于,HashMap的key保留了對實際對象的"強(qiáng)引用"膝宁,這意味著只要該HashMap對象不被銷毀鸦难,該HashMap所引用的對象就不會被垃圾回收。但WeakHashMap的key只保留了對實際對象的弱引用员淫,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強(qiáng)引用變量所引用合蔽,則這些key所引用的對象可能被垃圾回收,當(dāng)垃圾回收了該key所對應(yīng)的實際對象之后介返,WeakHashMap也可能自動刪除這些key所對應(yīng)的key-value對拴事。
- Hashtable
同步,線程安全圣蝎;(HashTable容器使用synchronized來保證線程安全刃宵,在線程競爭激烈的情況下HashTable的效率非常低下。當(dāng)一個線程訪問HashTable的同步方法時捅彻,其他線程訪問HashTable的同步方法時组去,可能會進(jìn)入阻塞或輪詢狀態(tài))
不允許null值,key和value都不可以
ArrayList與Vector的區(qū)別:
ArrayList是JDK1.2之后推出的步淹,比Vector新从隆。
ArrayList采用異步處理的方式,性能更高缭裆。Vector采用同步處理键闺。
ArrayList非線程安全,vector線程安全澈驼。
ArrayList只能用Iterator辛燥、foreach輸出,Vector除此之外還可以用Enumeration輸出缝其。
HashMap與HashTable的區(qū)別
HashTable是舊的操作類挎塌。
HashMap采用異步處理,性能更高内边。HashTable同步處理榴都。
HashMap線程不安全,HashTable線程安全漠其。
HashMap允許key設(shè)為null嘴高,Hashtable不允許竿音。
Collection與collections的區(qū)別
Collection是一個接口;Collections是一個類拴驮,里面有很多靜態(tài)方法春瞬,這個類不能實例化。