1. 程式人生 > >基於Java容器類的執行緒安全程式設計

基於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)的情況下才能找到相關的值