Java Collections
Java集合類如圖所示
1. Iterator
迭代器接口,是一種設計模式,用來遍曆序列對象。
1.1 ListIterotr
可雙向遍曆。
2. Collection
-
最基本的集合接口,繼承於Iterator,自身不被直接繼承,兩個子接口List和Set
2.1 List
- 有序Collection
- 提供基於索引的隨機訪問,內容可重複。
- 實現了ListIterator接口,可向前遍曆
2.1.1 ArrayList
可變數組,允許隨機訪問
允許含null,隻能存對象
非同步,線程不安全
-
有容量Capacity,每次擴充原來的一半。創建ArrayList時最好指定Capacity,提高插入效率。存在空間浪費。
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
2.1.2 LinkedList
- 可變鏈表,允許隨機訪問
- 允許含null
- 可雙向遍曆,頭尾操作快,可以用作Stack、Queue、雙向Queue
- 非同步,線程不安全
- 比ArrayList更占空間,每個節點存儲兩個引用,分別指向前後元素
2.1.3 Vector
與ArrayList類似。
-
Vector很多方法由synchronized修飾,是同步的,線程安全。
- 如果遍曆Vector過程中,另一個線程改變了Vector,則會報錯。
-
擴充容量為原來的一倍,並且可以自己設置擴充因子
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
2.1.4 Stack
- 繼承於Vector,Vector的堆棧實現,包括empty、peek、pop、push、search等方法。
2.2 Set
- 成員不可重複
- 可以有序
2.2.1 HashSet
- 基於HashMap,key存值,value存係統默認的Object對象,可快速查找
- 不保證有序,非同步
- 成員為Object子類對象
- 可以放一個null
2.2.2 TreeSet
- 基於TreeMap,默認有序
- 自定義對象要實現Comparable接口才能放入TreeSet
2.2.3 LinkedHashSet
- 在HashSet基礎上,維護一個鏈表來記錄插入順序。這使得它訪問順序比HashSet好,但插入順序相比稍差。
3. Map
鍵值對,鍵不能重複,快速查找
3.1 HashMap
- 可含有一個key為null的鍵值對
- 非同步,若讓HashMap同步,使用Collections.synchorniezMap(),
- 去除了contains方法
- 擴容為2的冪
3.2 TreeMap
- 基於紅黑樹,有序
- 遍曆value時盡量使用entrySet遍曆,這樣防止二次查找(keySet找value極慢)
- 可以返回一個子樹
3.3 LinkedHashMap
- HashMap子類,於LinkedHashSet類似,額外添加雙向鏈表來保證順序
最後更新:2017-09-07 10:02:56