JAVA jdk1.8 HashMap 存值流程圖解

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

問到什麼時候需要將鏈表轉換成紅黑樹,基本大家的回答就只說到 鏈表長度達到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
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)

結束

 

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