天天看點

Java集合架構Java容器

Java容器

Java集合架構Java容器
Java集合架構Java容器

一、Map

1、HashMap

  • JDK1.7中使用數組+連結清單實作
  • JDK1.8中使用數組+連結清單+紅黑樹實作
  • 在JDK1.8中的原理

    初始容量(capacity )為16,在第一次放入元素時才配置設定

    擴容條件:目前容量(capacity )*加載因子(loadFactor )>總容量(threshold )。每次擴容為目前的2倍

    當連結清單節點大于8個,且桶的長度大于64則更新為紅黑樹,沒有超過64則直接擴容為兩倍

    當紅黑樹的節點小于6個則還原為連結清單

  • 線程不安全
  • 無序、最多一條key為null的資料

2、HashTable

  • 哈希表:數組+連結清單實作
  • 初始容量為11,加載因子0.75,每次擴容為2倍+1
  • 線程安全

3、TreeMap

  • 紅黑樹實作
  • 對key自動排序,key不能重複
  • 無序、鍵值可為null

4、LinkedHashMap

  • 連結清單實作
  • 有序
  • 線程不安全

5、ConcurrentHashMap

  • JDK1.7:使用分段鎖segment
  • JDK1.8:取消分段鎖,使用CAS和Synchronized來保證線程安全,Synchronized隻鎖了目前連結清單或紅黑樹的首結點,進而提升了效率

二、Collection

1、List

ArrayList

  • 動态數組實作
  • JDK1.7:在建立對象時就建立一個長度為10的資料,放不下時建立一個長度為原先1.5倍的新數組,将原先的内容複制到新數組。對象的建立類似單例模式中的餓漢式。
  • JDK1.8:建立對象時建立空數組,第一次調用add操作時才建立長度為10的數組。對象的建立類似單例模式中的懶漢式。
  • 線程不安全
  • 查詢快、增删慢

LinkedList

  • 雙向連結清單實作
  • 線程不安全
  • 增删快、查詢慢
  • 空間占用比ArrayList大

Vector

  • 動态數組實作
  • 預設建立長度為10的數組,每次擴容為目前的兩倍
  • 線程安全,synchronized實作。相當于加了鎖的ArrayList

CopyOnWriterArrayList

  • 寫入時複制
  • 适合大量讀的操作,可以讀寫分離,但并不是讀寫鎖實作的
  • 線程安全
  • 初始容量為0,每次寫入的時候擴容,新的容量為插入容量+目前容量

2、Set

TreeSet

  • 基于TreeMap實作
  • 有序、不允許有重複元素

HashSet

  • 基于HashMap實作
  • 無序、不允許有重複元素, 允許有 null 值
  • 線程不安全

LinkedHashSet

  • 基于LinkedHashMap實作

CopyOnWriteSet

  • 基于CopyOnWriteArrayList實作

3、Queue

Deque

  • 常用子類ArrayDeque

BlockingQueue——阻塞隊列

  • 常用子類

    LinkedBlockingQueue

    ArrayBlockingQueue

  • 常用來實作生産者和消費者模型

AbstractQueue

學習筆記,歡迎糾正補充~

繼續閱讀