Java集合 - Map接口

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對象內部而已。

具體步驟:

  1. 傳輸要添加的數據的k,v;
  2. 根據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的異同?(暫時不講)

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章