HashMap#put (K key, V value)過程白話文

jdk7的put過程

  1. 先判斷key是否爲null,如爲null則調用putfornullkey(value)方法,在數組的表頭位置插入或覆蓋null kye的值;
  2. 根據鍵值key計算hash值獲得插入的數組索引;
  3. 若該索引位置有值,則遍歷該處的鏈表,若鏈表操做相同key,則覆蓋並返回舊值;
  4. 若key對應桶位位null,或者鏈表中沒有相同的key,則將修改計算加一;
  5. 判斷實際存在的鍵值對數量size是否大於閾值,若大於則進行擴容並從新計算key對應新數組的桶位;
  6. 最後向對應桶位的表頭插入新值,size加一。

jdk7的resize過程

  1. 先判斷原數組的大小是否已經到達最大值,若已經到達最大值,則將閾值設爲int的最大值,而後返回,至此之後該HashMap就不會再進行擴容了;
  2. 初始化一個新的entry數組,數組大小爲原數組的兩倍;
  3. 將原數組的數據轉移至新數組裏,轉移的過程爲:
    • 遍歷數組,查詢計算桶位,並已頭插發插入新數組對應的位置,若當前位置是個鏈表,則繼續遍歷鏈表
  4. 最後將新數組的引用賦給table變量,並繼續新的閾值。

jdk8的put過程

①.判斷鍵值對數組是否爲空或爲null,若條件成立則執行resize()進行擴容;
②.根據鍵值key計算hash值獲得插入的數組索引,若是索引位置的值爲null,直接新建節點添加,轉向⑥,若是不爲空,轉向③;
③.判斷桶位的首個元素是否和key同樣,若是相同直接覆蓋value,不然轉向④,這裏的相同指的是hashCode以及equals;
④.判斷桶位是否爲treeNode,即該節點是不是紅黑樹,若是是紅黑樹,則直接在樹中插入鍵值對,不然轉向⑤;
⑤.遍歷該桶位的節點,判斷鏈表長度是否大於8,大於8的話把鏈表轉換爲紅黑樹,在紅黑樹中執行插入操做,不然進行鏈表的插入操做(這裏用的尾插發);遍歷過程當中若發現key已經存在直接覆蓋value便可;
⑥.插入成功後,判斷實際存在的鍵值對數量size是否超過閾值,若是超過,進行擴容。數組

相關文章
相關標籤/搜索