java 常用集合類總結

在平常的代碼開發中,集合類是經常會使用到的,比如用於列表緩存的ArrayList,用於做映射關係的Map等等

最近重點看了下java集合類的層次繼承關係和內部存儲結構,做個總結以便後面可以隨時翻翻。


       java中的集合,不管是List,Set,還是Map,都是繼承自collection接口,這個接口主要定義了集合類的一些公關方法,比如isEmpty(), remove(),add()等,在使用集合類的時候除了順序遍歷,還提供了一種方便的迭代器遍歷的方法,在遍歷過程中需要remove元素的必須試用迭代器遍歷(在刪除元素時,集合內部的index會發生變化,使用順序遍歷可能會產生unindex的情況)。

      爲了實現迭代遍歷,定義了Iterable接口,collection接口繼承了Iterable接口,以支持所有集合類實現迭代遍歷。


1.List

1.1 ArrayList

ArrayList  是一個動態數組,以一個數組的格式進行存儲,但是可以動態增長,繼承自AbstractList,實現了List接口


ArrayList是一個非線程安全的類,使用時最好在一個線程中操作,構造函數可以提供一個數組的初始化大小,不提供默認按16來進行數組的初始化,往ArrayList增加元素時,都會先判斷是否還有空間存在元素,如果沒有空間,則會重新申請一個

(((以前長度*3)/2)+1)大小的數組空間,並將原來的元素全部copy到新的數組中,這樣會帶來效率上的損耗。建議在初始化時,能夠確定存儲空間的儘量提供合適的初始化數組大小,避免因爲數組動態擴容帶來的效率損耗。

1.2 Vector

Vector 基本上很少用到了,和ArrayList很相似,唯一的不同是Vector的方法都是線程安全的,而Array List是非線程安全的,從這點上來說,ArrayList的效率要比Vector的效率高,另外Vector是以2倍的方式擴展數組容量的

1.3 LinkedList

LinkedList 同時實現了List,Deque,所以也可以用來作爲雙向隊列使用。LinkedList是以雙向列表存儲的,它是按照元素的先後順序進行存儲的,所以訪問也是按照順序來訪問的。

2 Set  

 Set 繼承了Collection,Set不保存重複的元素,存入Set裏的元素都是唯一的,區分存入的元素是否重複是通過調用Equals方法來進行判斷,所有存入Set中的元素類必須實現Equals方法

2.1 HashSet

Hash Set是講存入Set中的元素以Hash鏈表的方式存儲起來,所有元素存入Set中的位置通過調用hashCode方法獲取hash值來決定,所以需要設計好的hashcode方法儘量將存入的值散列開有利於提升HashSet的訪問效率。

2.2 LinkedHashSet

繼承與HashSet,和HashSet的唯一區別是維護了一個雙向列表來維護元素的順序,所有訪問是按順序訪問

2.3 TreeSet

TreeSet繼承於AbstractSet,並且實現了NavigableSet接口

TreeSet實現了一個順序訪問的不重複元素的Set,底層使用紅黑樹進行數據的存儲,來加快訪問的速度

2.4 EnumSet

EnumSet只能用來存放Enum類型的數據,也不允許重複數據,性能是最好的

3 Map

Map和Set的區別是Set只有值,而Map是一個鍵值對<key,value>,Set不存重複的元素,Map中的key不能相同

3.1 HashMap

和HashSet相似,用hash鏈表來存儲,講鍵值對作爲一個元素存儲

3.2 LinkedHashMap

類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因爲它使用鏈表維護內部次序

3.3 TreeMap

基於紅黑樹數據結構的實現。查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
3.4 WeakHashMap

弱鍵(weak key)Map,Map中使用的對象也被允許釋放: 這是爲解決特殊問題設計的。如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章