一、概述
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...