HashMap、HashTable、ConcurrentHashMap的區別
HashMap: 1、底層陣列+連結串列實現,可以儲存null鍵和null值,執行緒不安全
2、初始size為16,擴容:newsize = oldsize*2,size一定為2的n次冪
3、擴容針對整個Map,每次擴容時,原來陣列中的元素依次重新計算存放位置,並重新插入
4、插入元素後才判斷該不該擴容,有可能無效擴容(插入後如果擴容,如果沒有再次插入,就會產生無效擴容)
5、當Map中元素總數超過Entry陣列的75%,觸發擴容操作,為了減少連結串列長度,元素分配更均勻
HashMap的初始值還要考慮載入因子:
1、雜湊衝突:若干Key的雜湊值按陣列大小取模後,如果落在同一個陣列下標上,將組成一條Entry鏈,對Key的查詢需要遍歷Entry鏈上的每個元素執行equals()比較。
2、載入因子:為了降低雜湊衝突的概率,預設當HashMap中的鍵值對達到陣列大小的75%時,即會觸發擴容。因此,如果預估容量是100,即需要設定100/0.75=134的陣列大小。
3、空間換時間:如果希望加快Key查詢的時間,還可以進一步降低載入因子,加大初始大小,以降低雜湊衝突的概率。
HashTable:1、底層陣列+連結串列實現,不可以儲存null鍵和null值,執行緒安全(實現執行緒安全的方式為在修改資料時鎖住整個HashTable,效率低下)
2、初始size為11,擴容:newsize = olesize*2+1
ConcurrentHashMap:1、底層分段陣列+連結串列實現,執行緒安全
2、通過把整個Map分為N個Segment,可以提供相同的執行緒安全,但是效率提升N倍,預設提升16倍。(讀操作不加鎖,由於HashEntry的value變數是 volatile的,也能保證讀取到最新的值。)
3、Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨佔,ConcurrentHashMap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術
4、有些方法需要跨段,比如size()和containsValue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖
5、擴容:段內擴容(段內元素超過該段對應Entry陣列長度的75%觸發擴容,不會對整個Map進行擴容),插入前檢測需不需要擴容,有效避免無效擴容
相關文章
- HashMap、Hashtable、ConcurrentHashMap的原理與區別HashMap
- 集合類HashMap,HashTable,ConcurrentHashMap區別?HashMap
- HashTable、ConcurrentHashMap、TreeMap、HashMap關於鍵值的區別HashMap
- HashTable與ConcurrentHashMap的區別HashMap
- 10分鐘掌握ConcurrentHashMap 3分鐘清楚和HashMap、Hashtable的區別HashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- C#中Hashtable和HashMap的區別C#HashMap
- 一文讀懂JDK7,8,9的hashmap,hashtable,concurrenthashmap及他們的區別JDKHashMap
- java複習之HashMap和Hashtable的區別JavaHashMap
- HashMap為何執行緒不安全?HashMap,HashTable,ConcurrentHashMap對比HashMap執行緒
- 一文讀懂JDK1.7,JDK1.8,JDK1.9的hashmap,hashtable,concurrenthashmap及他們的區別JDKHashMap
- 五分鐘看懂Hashtable原始碼以及與HashMap的區別原始碼HashMap
- ConcurrentHashMap 與HashTableHashMap
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及區別JavaHashMap
- Hashtable和HashMapHashMap
- 【java】【Map】HashMap、Hashtable、CollectionsJavaHashMap
- 什麼是ConcurrentHashMap?不同JDK下ConcurrentHashMap的區別?HashMapJDK
- HashMap以及ConcurrentHashMap(volatile)HashMap
- HashMap、Hash Table、ConcurrentHashMapHashMap
- HashMap、LinkedHashMap、HashTable、HashSet筆記HashMap筆記
- HashSet與HashMap的區別HashMap
- 原始碼分析–ConcurrentHashMap與HashTable(JDK1.8)原始碼HashMapJDK
- Java集合詳解4:一文讀懂HashMap和HashTable的區別以及常見面試題JavaHashMap面試題
- Hashtable/HashMap與key/value為null的關係HashMapNull
- HashMap 、ConcurrentHashMap知識點全解析HashMap
- Java中HashMap,LinkedHashMap,TreeMap的區別[轉]JavaHashMap
- hashmap和concurrenthashmap原始碼分析(1.7/1.8)HashMap原始碼
- Java7/8中的HashMap和ConcurrentHashMap全解析JavaHashMap
- 三,TreeMap和HashMap,TreeSet和HashMap的區別以及方法使用上的不同HashMap
- HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 區別HashMap
- 一文讀懂JDK7,8,9的hashmap,hashtable,concJDKHashMap
- 為什麼HashMap的鍵值可以為null,而ConcurrentHashMap不行?HashMapNull
- Java併發指南13:Java 中的 HashMap 和 ConcurrentHashMap 全解析JavaHashMap
- 為什麼hashtable不允許設定Null但是hashmap允許?NullHashMap
- 一文讓你徹底理解 Java HashMap 和 ConcurrentHashMapJavaHashMap
- 別再問我ConcurrentHashMap了HashMap
- Java併發指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析JavaHashMap
- 徹底搞清楚ConcurrentHashMap的實現原理(含JDK1.7和JDK1.8的區別)HashMapJDK