1. 程式人生 > >Java集合總結

Java集合總結

title list 向量 spm get 異常 失敗 ase 查找

今天又復習Java的集合類,相比之前的學習,又有了許多收獲,而且時記到腦子裏邊了,或者是要堅持寫博客的緣故把。

進入正題,首先是要搞清Collection和Collections,Collection是List,set和Queue接口的父接口,而Collections是一個操作集合的工具類。

集合體系知識如下:

技術分享圖片

首先說Set集合:Set集合類似於一個蜜罐,可以把多個對象丟進去,而Set不能夠記住添加元素的順序。Set集合與Collection基本相同,沒有提供額外的方法,也可以說Set就是Collection。如果add()相同的元素,會返回flase,添加失敗。

HashSet:HashSet按照Hash算法來存儲結合中的元素,因此具有良好的存取和查找的性能。簡單的說,HashMap的底層實現是“基於拉鏈法的散列表”。詳細分析請參考深入解析HashMap、HashTable

LinkedHashSet:使用連表來維護元素,因為需要維護元素的插入順序,所以性能略低,低於HashSet。

TreeSet:采用紅黑樹的數據結構來存儲集合元素,並且支持兩種排序方法,自然排序和定制排序。註意:使用TreeSet時,保證添加的對象全都實現了Comparable接口,否則會添加失敗,並且拋出ClassCastExecption異常。簡單一句話,如果想要TreeSet正常運行,只能添加同一種類型的對象。

EnumSet:為枚舉類設計的集合類。內部以向量的形式存儲,存儲形式非常緊湊,所有Enumset在對象占用內存小,而且效率高。

各Set實現類性能分析:HashSet性能總是高於TreeSet,如果想要保持排序的set,采用TreeSet。LinkedHashSet對於普通的插入刪除來說比HashSet略微慢一點,但是有了連表,遍歷LinkedHashSet會更快,EnumSet是Set實現類中性能最好的,但是只能保存同一類型的元素。並且所有的set實現類都是線程不安全的。

-------------------------------------分割線-----------------------------------------------------

現在我們再來說這個List和Queue

ArrayList和Vector (包括之後的ArrayDeque)都是基於數組來實現的,封裝了一個動態的,允許在分配Object[]數組。並且這個ArrayList和Vector的,Object[]數組的大小為10(ArrayDeque大小為16).

對於Vcetor,這是一個比較古老的的集合,產生於jdk1.0,那時候java還沒有集合,方法名都很長。之後也做過一些更新,方法名簡短了。而ArrayList一開始就作為List的主要實現類。所以比Vector優異一些,以後開發過程過可以采用。在這就是ArrayList是線程不安全的,但是可以使用Collections工具類,把ArrayList變成,線程安全的。

--

Queue集合,用於模擬隊列的“先進先出的結構”,而且PriorityQueue實現類是一個比較標準的實現類,之所以說是比較標準的,是因為元素並不是按照添加的順序來排序的,而是按照隊列元素大小進行排序的。

Deque接口是Queue的子接口,他代表了一個雙端隊列,Deque接口的典型實現類:ArrayDeque,是基於數組來實現的,底層數組長度為16

再來說說這個LinkedList,既可以當成隊列,也可以當成棧來用。

最後分析一下性能:對於常用類ArrayList(基於數組)和LinkedList(基於線性表),初學者可以不必理會性能差劣,只知道LinkedList不僅提供了List功能,還提供了雙端隊列,棧的功能。

拋棄插入刪除性能,總體來來說ArrayList的性能優異與LinkedList,因為大多數可以考慮使用ArrayList.對於ArrayList,Vector,and LinkedList的遍歷,因為ArrayList和Vector是基於數組實現的,應該使用隨機訪問方法get去訪問,對於LinkedList應該采用叠代器。

=======================

關於Map在map的所有子接口和實現類中,最常用的就是HashMap和TreeMap,換句話來說Map 和Set有著異曲同工之妙,詳解可以看API,java源碼就是先是實現了HaspMap TreeMap等集合,然後通過包裝一個所有value都有null的Map集合實現了Set的集合類。

用的話首先選擇HaspMap,如果想要保持排序,則用TreeMap

參考資料:李剛大叔的《瘋狂Java講義》---

文章主要是自己學習的筆記,難免有些語句表達的不正確甚至是錯誤的,歡迎大家指出,一定虛心改正。

Java集合總結