1.類繼承體系
在集合框架的類繼承體系中,最頂層有兩個接口Collection、Map;git
- Collection 表示一組純數據
- Map 表示一組key-value對
Collection的類繼承體系:github
Map的類繼承體系:數組
2.集合框架
2.1 ArrayList
可變數組的實現,高效隨機訪問RandomAccess ,但插入和刪除元素時須要複製數組,開銷較大;默認容量10,擴容爲原來的1.5倍(oldCapacity + (oldCapacity >> 1));
fail-fast : modCount記錄容器發生結構化修改的次數(ensureExplicitCapacity 方法中加1)
添加:add、add(index, E)、add(Collection)、add(index, Collection)
移除:remove、fastremove(System.arraycopy)、置null來GC、trimToSize調整數組大小
獲取和修改:indexof、get、set(不會修改modCount)
迭代、SubList子列表、序列化安全
2.2 HashMap
哈希表實現(單向鏈表),數組中每個元素都是一個鏈表,把數組中的每一格稱爲一個桶(bin或bucket);容量默認爲1六、裝載因子0.75f、擴容x2;併發
哈希碰撞問題;框架
hash實現:在Java 1.8的實現中,是經過hashCode()的高16位異或低16位實現的:(h = k.hashCode()) ^ (h >>> 16),主要是從速度、功效、質量來考慮的,這麼作能夠在bucket的n比較小的時候,也能保證考慮到高低bit都參與到hash的計算中,同時不會有太大的開銷dom
鏈表轉化成紅黑樹TREEIFY_THRESHOLD = 8,紅黑樹轉化成鏈表UNTREEIFY_THRESHOLD = 6;源碼分析
2.3 Vector 與 Stack
(不推薦,推薦使用 Deque 接口的實現,如 LinkedList 和 ArrayDeque)
Vector 可增加對象數組,線程安全;擴容加倍
Stack 基於Vector,LIFO性能
2.4 Deque 與 ArrayDeque
Collection -> Queue -> Deque 具體實現ArrayDeque ;
Deque 雙端隊列;
ArrayDeque可變數組實現,自動擴容,不支持null;默認容量16,必須爲2^n;優化
2.5 LinkedList
雙向鏈表實現,實現了Deque 接口;
2.6 LinkedHashMap
基於鏈表和哈希表實現,擴展HashMap 增長了雙向鏈表的實現;
支持按插入序 (insertion-order) 或訪問序 (access-order) 來訪問其中的元素;訪問順序LRU;
支持爲 null 的鍵和值;
雙向鏈表將全部的 Entry 串在一塊兒,支持按照插入順序或訪問順序來遍歷全部的 Entry;
2.7 枚舉
類型安全和可讀性,實現了 values() 和 valueOf() 這兩個靜態方法;
單例模式實現(最佳方案);
Enum(name,ordinal)
EnumSet 必須是來自同一個 enum,內部使用 bit 向量實現,這種實現方式更緊湊高效;
EnumMap 是一種特殊的 Map,要求其中的鍵 (key) 必須來自於同一個 enum。因爲自身的實例數量有限,在內部可由數組實現,所以速度很快;
2.8 TreeMap
基於紅黑樹實現的 Key-Value 結構;SortedMap -> NavigableMap -> TreeMap;
非線程安全;
Key默認天然序,不支持null,也可實現 Comparable 接口,自定義比較器能夠接受null;
2.9 Set
內部一般基於 Map實現,Map 中的 Key構成了 Set,而 Value 所有使用一個無心義的 Object ;
基於 HashMap 的 HashSet 是無序時的最佳通用實現,
基於 LinkedHashMap 的 LinkedHashSet 保留插入或訪問的順序,
基於 TreeMap 的 TreeSet 能夠按照元素升序排列,要求元素實現 Comaprable 接口或自定義比較器以上都是非線程安全;
2.10 CopyOnWriteArraySet
線程安全,併發優化的ArrayList,經過 CopyOnWriteArrayList 實現;
CopyOnWriteArrayList,是一個線程安全的List接口的實現,它使用了ReentrantLock鎖來保證在併發狀況下提供高性能的併發讀取;
3.注意點
1.基於結構化修改的次數來實現 fail-fast 機制,比較modCount 和 expectModCount;
源碼分析: