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
- 常用來實作生産者和消費者模型