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...