hashMap關鍵知識點

2021-10-02 13:43:45 字數 992 閱讀 1706

1、資料結構

jdk1.7是陣列加鍊表,jdk1.8是陣列加鍊表加紅黑樹(鍊錶太長了查詢也慢,所以鍊錶長度超過8時就使用紅黑樹咯)

2、hashmap的初始化大小

1)不給長度時,預設初始化為16,建立map時盡量給個長度,防止不斷擴容影響效率。

2)大小為2的n次冪時,雜湊得比較均勻,那麼查詢就比較快

3、hashmap的put原理

1)把key值通過hash函式(hashcode與map長度減一的二進位製做與運算,這樣得出0到長度減一的下標)計算乙個位置index

例如:初始化長度為8  hashcode為11001 那麼下標就為0 0111&11001=0 0001 那麼下標就為1

初始化長度為8 hashcode為11111 那麼下標就為0 0111&11111=0 0111 那麼下標就為7

2)檢測index所在位置是否有值,有值得話就比較key值是否相等, 不等的話直接把值接在所在物件的鍊錶的後面,相等的話就覆蓋原有的值

4、hashmap的擴容原理

1)當map中的元素個數等於map長度乘以載入因子時,就需要擴容了;擴容到原來長度的兩倍

2)擴容使用的是頭插法,擴容之後鍊錶的順序為倒序,這也是導致多執行緒擴容時出現環路導致執行緒不安全的原因

5、hashmap的get原理

1)把key值通過hash函式計算乙個位置index

6、hashmap的載入因子

1)預設載入因子時0.75,但是可以自定義。

2)提高空間利用率和 減少查詢成本的折中,主要是泊松分布,0.75的話碰撞最小

7、hashmap的執行緒安全問題

擴容時,由於鍊錶擴容之後為倒序,多執行緒一起擴容時煉表會形成迴路,導致死迴圈,即執行緒不安全。

8、原始碼展示 待續

hashmap知識點小結

1.hashmap是基於hash表的map介面實現 2.hashmap底層採用的是entry陣列和鍊錶實現的 3.hashmap採用鍵值隊 key,value 結構,其中 key不可重複,可以為null,value的值可以重複。4.hashmap為執行緒不安全,無synchronized修飾 5.h...

HashMap面試知識點

答案 2個put會同時擴容造成死迴圈 鍊錶有環 可能有2個同時put,導致1個丟失,被後面的put覆蓋了。一種情況是2個執行緒,1存1取,a剛存完key1value1,還沒等b取值,a又存完key1value2,這樣b取值只能取得key1value2,key1value1就丟失了 答案 當hashm...

HashMap知識點和紅黑樹知識點

hashmap知識點 初始容量 16 裝載因子 0.75 預設限制擴容數 64 轉換紅黑樹閾值 8 轉換鍊錶閾值 6 當鍊表長度大於8 鍊錶轉為紅黑樹 前提是hashmap容量達到64 當紅黑樹中的元素個數小於6 再轉回鍊錶 前提是根節點或者子節點為空 其實不準確 2.1 大於8,是先考慮table...