JDK8 HashMap原始碼解析 put方法

2021-08-20 08:42:27 字數 1925 閱讀 6033

一、概述

map的put方法接受兩個引數,key和value,該方法用於儲存鍵值對。

hashmap的put方法只有一行**:

return putval(hash(key), key, value, false, true); //參見:hash方法解析hash方法解析
可知put方法是乙個方便使用者使用的快捷方式,具體邏輯都是在putval方法中實現的,我們就針對putval方法的實現來做解析。

二、方法解析

/**

* @param hash key的hash值

* @param key 鍵

* @param value 值

* @param onlyifabsent 設為true表示如果鍵不存在,才會寫入值。

* @param evict

* @return 返回value

*/final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

// 如果下乙個節點的 hash值和key值都和要寫入的hash 和 key相同

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break; // 跳出迴圈,因為找到了相同的key對應的元素

p = e;}}

if (e != null)

}// 執行到這裡,說明是增加了新的元素,而不是替換了老的元素,所以相關計數需要累加

++modcount; // 修改計數器遞增

// 當前map的元素個數遞增

if (++size > threshold) // 如果當前map的元素個數大於了擴容閥值,那麼需要擴容元素陣列了

resize(); // 元素陣列擴容

afternodeinsertion(evict); // 新增新元素之後的後後置處理, linkedhashmap中有具體實現

return null; // 返回空

}resize方法解析

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length; // n 設定為 陣列長度

// 根據hash值和陣列長度取摸計算出陣列下標

if ((p = tab[i = (n - 1) & hash]) == null) // 如果該位置不存在元素,那麼建立乙個新元素儲存到陣列的該位置。

tab[i] = newnode(hash, key, value, null); // 此處單獨解析

else

// 如果下乙個節點的 hash值和key值都和要寫入的hash 和 key相同

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break; // 跳出迴圈,因為找到了相同的key對應的元素

p = e;}}

if (e != null)

}// 執行到這裡,說明是增加了新的元素,而不是替換了老的元素,所以相關計數需要累加

++modcount; // 修改計數器遞增

// 當前map的元素個數遞增

if (++size > threshold) // 如果當前map的元素個數大於了擴容閥值,那麼需要擴容元素陣列了

resize(); // 元素陣列擴容

afternodeinsertion(evict); // 新增新元素之後的後後置處理, linkedhashmap中有具體實現

return null; // 返回空

}

JDK8 HashMap原始碼解析 resize方法

一 概述 hashmap的resize方法的作用 在向hashmap裡put元素的時候,hashmap基於擴容規則發現需要擴容的時候會呼叫該方法來進行擴容。二 方法解析 final node resize 如果陣列元素個數在正常範圍內,那麼新的陣列容量為老的陣列容量的2倍 左移1位相當於乘以2 如果...

hashmap原始碼分析jdk8

最近看了下jdk8的hashmap原始碼,相比於7,在儲存結構上有了些改變。1.在jdk8之前,hashmap的儲存結構是陣列 鍊錶的形式,那麼這種方式隨著鍊錶的長度增加,效率也凸顯出來。所以在jdk8中這塊做了優化,當鍊表超過一定長度時轉化為紅黑樹來解決這個問題,下面用流程圖畫出hashmap 的...

HashMap原始碼分析JDK8 putVal方法

hashmap底層資料結構 插入的所有情況 原始碼分析 實現map介面的put方法和相關功能 引數hash 新增鍵值對中key的雜湊值 引數key 新增鍵值對的鍵key 引數value 新增鍵值對的值value 引數onlyifabsent 如果是true,不改變鍵值對中的舊值 引數evict 在h...