集合对比
1. 初始容量
Collection
Set:
- HashSet ?
- TreeSet
- LinkedListSet
List:
- ArrayList
- 數(shù)組的默認(rèn)大小為 10
- LinkedList
Queue
- PriorityQueue
Map
- TreeMap
- HashTable
- 默認(rèn)為11
- 負(fù)載因子:0.75
- HashMap
- 不指明大小時,默認(rèn)為16
- 負(fù)載因子默認(rèn)為0.75
- 若給定初始容量initialCapacity,則返回的容量>=給定參數(shù)initialCapacity最小的2的冪次方的數(shù)值。
- LinkedHashMap
2. 擴(kuò)容
Collection
Set:
- HashSet ?
- TreeSet
- LinkedListSet
List:
- ArrayList
- 新容量的大小為 oldCapacity + (oldCapacity>> 1) ,也就是舊容量的 1.5 倍。
- 需要調(diào)用 Arrays.copyOf() 把原數(shù)組整個復(fù)制到新數(shù)組中
- 最好在創(chuàng)建 ArrayList 對象時就指定大概的容量大小,減少擴(kuò)容操作的次數(shù)。
- Vector
- 擴(kuò)容請求其大小的 2 倍空間
- LinkedList
Queue
- PriorityQueue
Map
- TreeMap
- HashTable
- 擴(kuò)展到2的倍數(shù)
- HashMap
- 擴(kuò)展為oldCapacity*2+1
- 先擴(kuò)展,再把舊數(shù)組里面的元素一個一個添加到新的里面
- 擴(kuò)容機(jī)制包含了兩部分:
- HahMap中table數(shù)組的容量的擴(kuò)充;
- 成員屬性threshold(即擴(kuò)容的臨界值)的更改。
- LinkedHashMap
3. 線程安全
Collection
Set:
- HashSet ?
- TreeSet
- LinkedListSet
List:
- ArrayList
- 不安全
- Vector
- 使用了synchronized 進(jìn)行同步
- ?
- LinkedList
Queue
- PriorityQueue
Map
- TreeMap
- HashTable
- 安全
- 大多數(shù)方法都是加了synchronized關(guān)鍵字
- 安全
- HashMap
- 不安全
- Key與Value都允許為空
- get()和put()均無synchronized關(guān)鍵字修飾
- LinkedHashMap
4. 添加
Collection
Set:
- HashSet ?
- TreeSet
- LinkedListSet
List:
- ArrayList
- 添加元素時使用 ensureCapacityInternal() 方法來保證容量足夠,
- LinkedList
Queue
- PriorityQueue
Map
- TreeMap
- HashTable:
- 關(guān)于value,明顯有if判斷,不能為null。
- 如果key為null,則也直接在計(jì)算hashCode的時候就會報(bào)空指針異常。
- HashMap
- 允許null值和null鍵。
- 根據(jù)傳入的key計(jì)算hash值,得到插入的數(shù)組索引i;
- 使用鏈表或者紅黑樹來解決沖突
- 如果tab[i]==null,則此下標(biāo)處無元素存在,可直接添加元素,否則出現(xiàn)沖突。
- 如果出現(xiàn)沖突,則掃描鏈表或者紅黑樹。
- 在此過程中,可以使用equals()方法來確定是否存在該元素;
- 如果存在,則直接更新;
- 否則,采用鏈表或紅黑樹的方式將元素添加在tab[i]對應(yīng)的鏈表或紅黑樹中。
- LinkedHashMap
5. 解決沖突的方式
Collection
Set:
- HashSet ?
- TreeSet
- LinkedListSet
List:
- ArrayList
- LinkedList
Queue
- PriorityQueue
Map
- TreeMap
- HashTable
- 只有鏈表
- HashMap
- 鏈表/紅黑樹
- 沖突數(shù)量<8,以鏈表方式解決沖突
- 沖突數(shù)量>=8,將沖突的Entry轉(zhuǎn)換為紅黑樹進(jìn)行存儲
- 又當(dāng)沖突數(shù)量<6時,有轉(zhuǎn)換為鏈表進(jìn)行存儲
- 鏈表/紅黑樹
- LinkedHashMap
總結(jié)
- 上一篇: Java实现线程同步的方式
- 下一篇: Cause: org.postgresq