標籤:
展示了Java容器類庫的完備圖,包括抽象類別和遺留構件(不包括Queue的實現)。
常用的容器用黑色粗線框表示,點線框表示介面,虛線框表示抽象類別,實線框表示類,空心箭頭表示實現關係。Produce表示任意的Map對象可以產生Collection對象,任意的Collection對象可以產生Iterator對象。
最後以表格的形式總結List、Set、Map介面及各實作類別的特性:
| |
特性 |
實作類別 |
實作類別特性 |
對放置的元素的要求 |
List |
線性、有序的儲存容器,可通過索引訪問元素get(n) |
ArrayList |
數組實現。非同步。 |
|
Vector |
類似ArrayList,同步。 |
|
LinkedList |
雙向鏈表。非同步。 |
|
Set |
元素不能重複,元素必須定義equals()方法 |
HashSet |
為快速尋找設計的Set |
元素必須定義hashCode() |
TreeSet |
保持次序的Set,底層為樹結構 |
元素必須實現Comparable介面 |
LinkedHashSet |
內部使用鏈表維護元素的順序(插入的次序) |
元素必須定義hashCode() |
Map |
儲存索引值對成員,Map中的所有鍵必須定義equals()方法 |
HashMap |
基於雜湊表的 Map 介面的實現,滿足通用需求 |
鍵必須有恰當的hashCode(),如果修改了equals方法,需同時修改hashCode方法 |
TreeMap |
預設根據自然順序進行排序,或者根據建立映射時提供的 Comparator進行排序 |
鍵成員要求實現caparable介面,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。 |
LinkedHashMap |
類似於HashMap,但迭代遍曆時取得“索引值對”的順序是其插入順序或者最近最少使用的次序 |
與HashMap相同 |
IdentityHashMap |
使用==取代equals()對“索引值”進行比較的散列映射 |
成員通過==判斷是否相等 |
WeakHashMap |
弱鍵映射,允許釋放映射所指向的對象 |
|
ConcurrentHashMap |
安全執行緒的Map |
|
(1)各種Queue和Stack的行為,完全可以LinkedList提供支援,上述表格不包含Queue。
(2)但凡是和hash相關的,必然會設計到hashCode方法,因為要根據返回的雜湊碼去計算該對象在雜湊表中的位置;但凡是和Tree相關的,必然會設計到Comparable介面,因為要涉及到排序。
(3)如果要進行大量的隨機訪問,就是用ArrayList;如果要經常從表中間插入或刪除元素,則應該用LinkedList。遍曆的時候,對於ArrayList優先選擇get方式,LinkedList優先選擇iterator方式。
(4)Collection繼承了Iterable介面,故所有的Collection對象都可以使用foreach方式,對元素進行遍曆。所有的Collection對象都hiuforeach迴圈可以與任何實現了Iterable介面的對象一起工作。
Java容器之旅:容器基礎知識總結