基於Java容器類的執行緒安全程式設計
Collection
├List 介面│├LinkedList 連結串列
│├ArrayList 順序結構動態陣列類
│└Vector 向量
│ └Stack 棧
└Set
Map
├Hashtable
├HashMap
└WeakHashMap List介面
List (介面) | 順序是List;最重要的特性它可保證元素按規定的順序排列List。為Collection添加了大量方法,以便我們在List 的中部插入和刪除元素(只推薦對LinkedList這樣做)。List也會生成一個ListIterator (列表迭代器),利用它可在一個List 裡朝兩個方向巡視,同時插入和刪除位於List 中部的元素 | 有序 | 可以有多個null | |
ArrayList | 由一個數組實現的List。可對元素進行速度非常快的隨機訪問。但用它在List 中部插入或刪除元素的時候,速度卻比較慢,ListIterator通常只能用於在一個ArrayList中來回“遍歷”,而不要用它插入或刪除元素——那應該是LinkedList的事情! | 有序 | ||
LinkedList | 提供優化的順序訪問效能,同時可以高效地在List中部進行插入和刪除操作。但在進行隨機訪問時,速度卻相當慢,此時應換用ArrayList。另外它還提供了addFirst()、 addLast()、getFirst() 、getLast() 、removeFirst()以及removeLast()等有用的方法(這些方法在任何介面或基類中均未定義),適用於對堆疊、佇列以及雙頭佇列進行操作 | 有序 | ||
Vector | 執行緒安全 | |||
Set(介面) | 新增到Set的每個元素都必須是獨一無二的;Set不會新增重複的元素。新增到Set裡的物件必須定義equals(),以樹立物件的“唯一”性。Set擁有與Collection完全相同的介面。Set介面並不保證自己會按任何特定的順序來容納元素。 | 最多有一個null | ||
EnumSet | 列舉 set 中所有鍵都必須來自單個列舉型別,該列舉型別在建立 set 時顯式或隱式地指定。型別安全 | 不允許使用 null 元素。 | ||
HashSet | 假如在一個Set 中的搜尋速度是至關重要的,就應考慮用HashSet。同時,Object還必須定義hashCode()。 | Set s = Collections.synchronizedSet(new HashSet(...)); | ||
TreeSet | 排好序的一種Set,採用樹形結構。這樣一來,就可從Set裡提取出一個固定順序的元素序列。 | 有序 | ||
Map(介面) | 維持“鍵—值”對應關係(對),以便根據一個鍵,查詢到相應的值 | |||
Hashtable | 不允許使用 null | 執行緒安全 | ||
HashMap | 基於一個散列表實現(用它代替Hashtable)。針對“鍵—值”對的插入和檢索,這種形式具有最穩定(但不是最好)的效能。可通過建構函式設定散列表的“容量”與“負載比”,從而對效能進行調整 | 允許使用 null | Map m = Collections.synchronizedMap(new HashMap(...)); | |
TreeMap | 在一個“紅—黑”樹的基礎上實現。檢視鍵或者“鍵值”對時,它們會按固定的順序排列(取決於Comparable或Comparator稍後即會講到)。TreeMap最大的好處就是我們得到的是已排好序的結果。TreeMap是提供了subMap()方法的唯一一種Map,用它可返回樹的一部分(子對映) | 有序 | 允許使用 null | Map m = Collections.synchronizedMap(new TreeMap(...)); |
關於Java Collection Framework,你可能已經知道如下一些事實
1、Vector是執行緒安全的,ArrayList不是
2、ArrayList的讀操作比LinkedList快,LinkedList的append操作比ArrayList快
3、Set中不可能有兩個相等的元素,也就是說,如果e1和e2都在同一個Set中,那麼不可能有e1.equals(e2)
4、HashMap是執行緒不安全的,HashTable是執行緒安全的
但是你可能還不知道或者不瞭解這些事情:
1、LinkedList不是執行緒安全的
2、不管是在多執行緒還是單執行緒的環境下,ArrayList都要比Vector快很多倍
3、Set中可以插入null,不過最多隻會有一個
4、HashMap中可以插入null,HashTable中不行
5、TreeSet使用compareTo代替equals判斷是否兩個元素相等
6、HashMap中的元素,無論是keySet還是valueSet,都不一定是按照插入時間先後排序的,HashSet也一樣
7、對於非執行緒安全的類,比如HashMap,ArrayList,TreeSet,可以使用Collections.synchronizedXXX方法(比如synchronizedSet,synchronizedList,synchronizedMap)
8、你可以使用Collections.unmodifiableList來構建出一個不能被修改的List
9、你可以使用Arrays.equals來判斷兩個陣列是否相等
10、WeakHashMap使用元素的引用而不是值作為key,也就是說必須在引用相同(a==b)的情況下才能找到相關的值