Map接口
主要內容:
① Map接口
1.1 各接口存儲數據的特點
1.2 Map存儲結構的理解
圖示:
1.3 HashMap底層源碼實現
(1)HashMap在jdk7中實現原理
(2)HashMap在jdk8中相較於jdk7在底層實現方面的不同
(3) HashMap底層典型屬性的屬性的說明
1.4 LinkedHashMap的底層實現原理(瞭解)
LinkedHashMap底層使用的結構與HashMap相同,因爲LinkedHashMap繼承於HashMap.
區別就在於:LinkedHashMap內部提供了Entry,替換HashMap中的Node.
1.5 TreeMap的使用
向TreeMap中添加key-value,要求key必須是由同一個類創建的對象
因爲要照key進行排序:自然排序 、定製排序
1.6 CurrentHashMap的使用
(1)CurrentHashMap作用的引出
針對HashMap中線程不安全的問題,解決的辦法:加鎖
1 對整個對象進行加鎖(HashTable,用synchronized關鍵字實現)
缺點:整個對象都加鎖,線程只能串行執行,不利於高併發的實現;
2 對每個index位置單獨加鎖(currenthasnmap,分段鎖的概念)
優點:保證了多線程的安全性
(2)CurrentHashMap的底層實現
① 底層結構
CurrentHashMap底層創建了一個segment類型的數組(HaashMap中創建的是Entry數組),數組中存儲的不是單獨的數據,而是一個一個的segment對象,每一個segment對象可以理解爲是一個HashMap。這樣設計就是爲了方便在每一個位置單獨加鎖。
② 對象的創建
- Initialcapacity:默認創建一個大小爲16的segment類型的數組。每個segment對象下的數組的默認長度是2。Initialcapacity指的是所有segment對象的所有數組長度之和(默認是16*2=32)。
- ConcurrentcyLevel:併發度,默認是16。
在初始化segment時,只創建一個segment對象s0,其他位置暫時爲空。S0下的哈希表默認長度爲2。
③ 添加元素
要注意:是每個Segment對象內部的哈希表進行擴容,而不是增加segment對象的數量。Put方法添加數據也應該是和hashmap的原理相同,只不過是發生在每個segment對象內部而已。
具體步驟:
- 傳輸要添加的數據的k,v;
- 根據k,v,計算出index,確定將數據添加到哪個segment對象中。先判斷要添加數據的位置segment是否爲空:
- 如果爲空,就創建一個segment對象,再添加數據;
- 如果不爲空,調用segment對象的put方法,傳入k,v,確定數據在對象內部哈希表上的位置;
④ CurrentHashMap中鎖的位置
文章鏈接:https://www.nowcoder.com/questionTerminal/1121f205015842a5b4cc724c05e2e48b?orderByHotValue=1&mutiTagIds=639&page=1&onlyReference=false
--------------------------------------------------------------------
Map [面試題]
1. HashMap的底層實現原理?(見上)
2. HashMap 和 Hashtable的異同?
3. CurrentHashMap 與 Hashtable的異同?(暫時不講)