1. 程式人生 > >java 常用集合類總結

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之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。