1. 程式人生 > >List、Map、Set、Queue的區別與關係

List、Map、Set、Queue的區別與關係

List、Set、Queue 都繼承自 Collection 介面,而 Map 則不是(繼承自 Object),所以容器類有兩個根介面,分別是 Collection 和 Map,Collection 表示單個元素的集合,Map 表示鍵值對的集合。

List 的主要特點就是有序性和元素可空性,他維護了元素的特定順序,其主要實現類有 ArrayList 和 LinkList。ArrayList 底層由陣列實現,允許元素隨機訪問,但是向 ArrayList 列表中間插入刪除元素需要移位複製速度略慢;LinkList 底層由雙向連結串列實現,適合頻繁向列表中插入刪除元素,隨機訪問需要遍歷所以速度略慢,適合當做堆疊、佇列、雙向佇列使用。

Set 的主要特性就是唯一性,存入 Set 的每個元素都必須唯一,加入 Set 的元素都必須確保物件的唯一性,Set 不保證維護元素的有序性,其主要實現類有 HashSet、LinkHashSet、TreeSet。HashSet 是為快速查詢元素而設計,存入 HashSet 的元素必須定義 hashCode 方法,其實質可以理解為是 HashMap 的包裝類,所以 HashSet 的值還具備可 null 性;LinkHashSet 具備 HashSet 的查詢速度且通過連結串列保證了元素的插入順序(實質為 HashSet 的子類),迭代時是有序的,同理存入 LinkHashSet 的元素必須定義 hashCode 方法;TreeSet 實質是 TreeMap 的包裝類,所以 TreeSet 的值不備可 null 性,其保證了元素的有序性,底層為紅黑樹結構,存入 TreeSet 的元素必須實現 Comparable 介面;不過特別注意 EnumSet 的實現和 EnumMap 沒有一點關係。

Queue 的主要特性就是佇列,其主要的實現類有 LinkedList、PriorityQueue。LinkedList 保證了按照元素的插入順序進行操作;PriorityQueue 按照優先順序進行插入抽取操作,元素可以通過實現 Comparable 介面來保證優先順序。Deque 是 Queue 的子介面,表示更為通用的雙端佇列,有明確的在頭或尾進行檢視、新增和刪除的方法,ArrayDeque 基於迴圈陣列實現,效率更高一些。

Map 自立門戶,但是也提供了嫁接到 Collection 相關方法,其主要特性就是維護鍵值對關聯和查詢特性,其主要實現類有 HashTable、HashMap、LinkedHashMap、TreeMap。HashTab 類似 HashMap,但是不允許鍵為 null 和值為 null,比 HashMap 慢,因為為同步操作;HashMap 是基於雜湊列表的實現,其鍵和值都可以為 null;LinkedHashMap 類似 HashMap,其鍵和值都可以為 null,其有序性為插入順序或者最近最少使用的次序(LRU 演算法的核心就是這個),之所以能有序,是因為每個元素還加入到了一個雙向連結串列中;TreeMap 是基於紅黑樹演算法實現的,檢視鍵值對時會被排序,存入的元素必須實現 Comparable 介面,但是不允許鍵為 null,值可以為 null;如果鍵為列舉型別可以使用專門的實現類 EnumMap,它使用效率更高的陣列實現。

從資料結構角度看集合的區別有如下:

動態陣列:ArrayList 內部是動態陣列,HashMap 內部的連結串列陣列也是動態擴充套件的,ArrayDeque 和 PriorityQueue 內部也都是動態擴充套件的陣列。

連結串列:LinkedList 是用雙向連結串列實現的,HashMap 中對映到同一個連結串列陣列的鍵值對是通過單向連結串列連結起來的,LinkedHashMap 中每個元素還加入到了一個雙向連結串列中以維護插入或訪問順序。

雜湊表:HashMap 是用雜湊表實現的,HashSet, LinkedHashSet 和 LinkedHashMap 基於 HashMap,內部當然也是雜湊表。

排序二叉樹:TreeMap 是用紅黑樹(基於排序二叉樹)實現的,TreeSet 內部使用 TreeMap,當然也是紅黑樹,紅黑樹能保持元素的順序且綜合性能很高。

堆:PriorityQueue 是用堆實現的,堆邏輯上是樹,物理上是動態陣列,堆可以高效地解決一些其他資料結構難以解決的問題。

迴圈陣列:ArrayDeque 是用迴圈陣列實現的,通過對頭尾變數的維護,實現了高效的佇列操作。

位向量:EnumSet 是用位向量實現的,對於只有兩種狀態且需要進行集合運算的資料使用位向量進行表示、位運算進行處理,精簡且高效。