jdk1 8hashmap常見的面試問題

2022-06-01 12:30:15 字數 441 閱讀 5961

底層使用雜湊表(陣列加鍊表)來儲存,鍊錶過長會將鍊錶轉成紅黑樹,以實現在o(logn)時間複雜度內查詢

對key求雜湊值然後計算下標

如果沒有雜湊碰撞則直接放入槽中

如果碰撞了以鍊錶的形式鏈結到後面

如果鍊錶長度超過閾值(預設閾值是8),就把鍊錶轉成紅黑樹

如果節點已存在就替換舊值

如果槽滿了(容量*載入因子),就需要resize

高16bit不變,低16bit和高16bit做異或

(n-1)&hash獲得下標

還有哪些雜湊實現方式?(查資料和部落格)

將節點加到鍊錶後

容量擴充為原來的兩倍,然後對每個節點重新計算雜湊值

這個值只可能在兩個地方:一種是在原下標位置,另一種是在下標為《原下標+原容量》的位置

開放位址法,鏈位址法

將鍊錶轉為紅黑樹,jdk1.8已經實現

JDK 1 8 HashMap擴容原理

擴容前計算索引 1010 0101 0000 1111 0000 0101 索引結果 5擴容以後容量是n 32 對應的二進位制是0001 1111 node本身的hash值是不變的,仍然是1010 0101,那麼擴容後node 的索引的計算是通過如下方式得到 擴容後計算索引 1010 0101 00...

JDK1 8 HashMap原始碼解析

普通常量 儲存node鍊錶的陣列 transient node table 由node節點構成的set集合 transient set entryset hashmap儲存元素的數量 transient int size 記錄hashmap結構性變化的次數 value覆蓋不算 和fail fast機...

JDK 1 8 HashMap原始碼解析

put方法分析 public v put k key,v value hash方法解析 減少hash衝突 static final int hash object key putval方法具體實現 final v putval int hash,k key,v value,boolean onlyi...