JDK集合框架源碼分析 - 簡單概要

 

1.類繼承體系

在集合框架的類繼承體系中,最頂層有兩個接口Collection、Map;git

  • Collection 表示一組純數據
  • Map 表示一組key-value對

Collection的類繼承體系:github

05233523_6nfs.jpeg

Map的類繼承體系:數組

 

05233523_Kp4s.jpg

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;

 

源碼分析:

http://blog.jrwang.me/tags/Source-Code-Analysis/

http://yikun.github.io/

相關文章
相關標籤/搜索