LinkedList 類數組
LinkedList 實現了 List 接口,容許 Null 元素。此外 LinkedList 提供額外的 Get、Remove、Insert 等方法在 LinkedList 的首部或尾部操做數據。這些操做使得 LinkedList 可被用做堆棧(Stack)、隊列(Queue)或雙向隊列(Deque)。請注意 LinkedList 沒有同步方法,它不是線程同步的,即若是多個線程同時訪問一個 List,則必須本身實現訪問同步。一種解決方法是在建立 List 時構造一個同步的 List,方法如函數
List list = Collections.synchronizedList(new LinkedList(...));性能
ArrayList 類測試
ArrayList 實現了可變大小的數組。它容許全部元素,包括 Null。Size、IsEmpty、Get、Set 等方法的運行時間爲常數,可是 Add 方法開銷爲分攤的常數,添加 N 個元素須要 O(N) 的時間,其餘的方法運行時間爲線性。spa
每 個 ArrayList 實例都有一個容量(Capacity),用於存儲元素的數組的大小,這個容量可隨着不斷添加新元素而自動增長。當須要插入大量元素時,在插入前能夠調用 ensureCapacity 方法來增長 ArrayList 的容量以提升插入效率。和 LinkedList 同樣,ArrayList 也是線程非同步的(unsynchronized)。線程
ArrayList 提供的主要方法:code
Boolean add(Object o) 將指定元素添加到列表的末尾;對象
Boolean add(int index,Object element) 在列表中指定位置加入指定元素;繼承
Boolean addAll(Collection c) 將指定集合添加到列表末尾;接口
Boolean addAll(int index,Collection c) 在列表中指定位置加入指定集合;
Boolean clear() 刪除列表中全部元素;
Boolean clone() 返回該列表實例的一個拷貝;
Boolean contains(Object o) 判斷列表中是否包含元素;
Boolean ensureCapacity(int m) 增長列表的容量,若是必須,該列表可以容納 m 個元素;
Object get(int index) 返回列表中指定位置的元素;
Int indexOf(Object elem) 在列表中查找指定元素的下標;
Int size() 返回當前列表的元素個數。
Vector 類
Vector 很是相似於 ArrayList,區別是 Vector 是線程同步的。由 Vector 建立的 Iterator,雖然和 ArrayList 建立的 Iterator 是同一接口,可是,由於 Vector 是同步的,當一個 Iterator 被建立並且正在被使用,另外一個線程改變了 Vector 的狀態(例如,添加或刪除了一些元素),這時調用 Iterator 的方法時將拋出 ConcurrentModificationException,所以必須捕獲該異常。
Stack 類
Stack 繼承自 Vector,實現了一個後進先出的堆棧。Stack 提供 5 個額外的方法使得 Vector 得以被看成堆棧使用。除了基本的 Push 和 Pop 方法,還有 Peek 方法獲得棧頂的元素,Empty 方法測試堆棧是否爲空,Search 方法檢測一個元素在堆棧中的位置。注意,Stack 剛建立後是空棧。
Set 類
Set 是一種不包含重複的元素的 Collection,即任意的兩個元素 e1 和 e2 都有 e1.equals(e2)=false。Set 最多有一個 null 元素。很明顯,Set 的構造函數有一個約束條件,傳入的 Collection 參數不能包含重複的元素。請注意,必須當心操做可變對象(Mutable Object),若是一個 Set 中的可變元素改變了自身狀態,這可能會致使一些問題。
Hashtable 類
Hashtable 繼承 Map 接口,實現了一個基於 Key-Value 映射的哈希表。任何非空(non-null)的對象均可做爲 Key 或者 Value。添加數據使用 Put(Key,Value),取出數據使用 Get(Key),這兩個基本操做的時間開銷爲常數。
Hashtable 經過 Initial Capacity 和 Load Factor 兩個參數調整性能。一般缺省的 Load Factor 0.75 較好地實現了時間和空間的均衡。增大 Load Factor 能夠節省空間但相應的查找時間將增大,會影響像 Get 和 Put 這樣的操做。使用 Hashtable 的簡單示例,將 一、二、3 這三個數字放到 Hashtable 裏面,他們的 Key 分別是」one」、」two」、」three」,代碼如清單 2 所示。
Hashtable numbers = new Hashtable(); numbers.put(「one」, new Integer(1)); numbers.put(「two」, new Integer(2)); numbers.put(「three」, new Integer(3));
若是咱們須要取出一個數,好比 2,能夠用相應的 key 來取出,代碼如清單 3 所示。
Integer n = (Integer)numbers.get(「two」); System.out.println(「two =」+ n);
因爲做爲 Key 的對象將經過計算其散列函數來肯定與之對應的 Value 的位置,所以任何做爲 key 的對象都必須實現 HashCode 和 Equals 方法。HashCode 和 Equals 方法繼承自根類 Object,若是你用自定義的類看成 Key 的話,要至關當心,按照散列函數的定義,若是兩個對象相同,即 obj1.equals(obj2)=true,則它們的 HashCode 必須相同,但若是兩個對象不一樣,則它們的 HashCode 不必定不一樣,若是兩個不一樣對象的 HashCode 相同,這種現象稱爲衝突,衝突會致使操做哈希表的時間開銷增大,因此儘可能定義好的 HashCode() 方法,能加快哈希表的操做。
若是相同的對象有不一樣的 HashCode,對哈希表的操做會出現意想不到的結果(期待的 Get 方法返回 Null),要避免這種問題,最好同時複寫 Equals 方法和 HashCode 方法,而不要只寫其中一個。
HashMap 類
HashMap 和 Hashtable 相似,不一樣之處在於 HashMap 是線程非同步的,而且容許 Null,即 Null Value 和 Null Key。可是將 HashMap 視爲 Collection 時(values() 方法可返回 Collection),其迭代子操做時間開銷和 HashMap 的容量成比例。所以,若是迭代操做的性能至關重要的話,不要將 HashMap 的初始化容量設得太高,或者 Load Factor 參數設置太低。
WeakHashMap 類
WeakHashMap 是一種改進的 HashMap,它對 Key 實行「弱引用」,若是一個 Key 再也不被外部所引用,那麼該 Key 能夠被 GC 回收。