天天看點

JAVA jdk1.8 HashMap 存值流程圖解

最近面試很多人,發現都是有個大概的記憶,但是都不清晰,是以我決定整理一下,用圖解的方式幫助 有緣分看到這篇文章的小夥伴 了解 hashmap裡 put 存值的過程。

問到什麼時候需要将連結清單轉換成紅黑樹,基本大家的回答就隻說到 連結清單長度達到8;

問到為什麼需要轉換紅黑樹,是為了解決什麼場景問題,也是回答得不清楚;

但是該篇不對這些關于hashmap的相關問題梳理,因為這個已經是比較普遍的面試題了,現在學習成本非常低,随便找下都能看到相關的面試題。

可以輕按兩下原圖閱讀

JAVA jdk1.8 HashMap 存值流程圖解

JCccc

開始

1.判斷位桶數組table是否為空  transient Node<k,v>[] table;  

1.1 如果為空,則進行第一次的擴容 ,配置設定預設值 數組初始容量 1 << 4 =16,同時設定擴容閥值 16*0.75


2.利用put的key值計算hash得出插入table的索引位置

2.1判斷目前的 table[索引值] 是否為null,若為空,進入3步驟
2.2 如果不為空,那麼需要判斷是否key值已存在

2.2.1 存在 ,直接覆寫
2.2.2 不存在,進入2.3

2.3判斷目前table[索引值]下是否為連結清單/紅黑樹

2.3.1 如果是連結清單,開始周遊連結清單進行插入,
插入前計算插入後連結清單長度是否達到8,如果大于則轉換為紅黑樹結構,進行key & value的插入。
如果連結清單長度沒有達到8,那麼插入時查找是否已經存在key,存在則覆寫value值;不存在則進行key & value的插入。


2.3.2 如果是紅黑樹,那麼進行key & value的插入(存在覆寫value)


3.直接建立出新的節點,進行key & value 值插入   tab[i] = newNode(hash, key, value, null);

4.判斷目前容量是否已經超越了hashmap的擴容門檻值(初始容量 16   * 加載因子  0.75)     if (++size > threshold)

結束