JDK8 HashMap原始碼解析 resize方法

2021-08-20 08:42:27 字數 1392 閱讀 7174

一、概述

hashmap的resize方法的作用:在向hashmap裡put元素的時候,hashmap基於擴容規則發現需要擴容的時候會呼叫該方法來進行擴容。

二、方法解析

final node resize() 

/** 如果陣列元素個數在正常範圍內,那麼新的陣列容量為老的陣列容量的2倍(左移1位相當於乘以2)

* 如果擴容之後的新容量小於最大容量 並且 老的陣列容量大於等於預設初始化容量(16),那麼新陣列的擴容閥值設定為老閥值的2倍。(老的陣列容量大於16意味著:要麼建構函式指定了乙個大於16的初始化容量值,要麼已經經歷過了至少一次擴容)

*/else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}// ps2

// 執行到這個else if 說明老陣列沒有任何元素

// 如果老陣列的擴容閥值大於0,那麼設定新陣列的容量為該閥值

// 這一步也就意味著構造該map的時候,指定了初始化容量。

else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

// 如果擴容閥值為0 (ps2的情況)

if (newthr == 0)

threshold = newthr; // 設定map的擴容閥值為 新的閥值

@suppresswarnings()

// 建立新的陣列(對於第一次新增元素,那麼這個陣列就是第乙個陣列;對於存在oldtab的時候,那麼這個陣列就是要需要擴容到的新陣列)

node newtab = (node)new node[newcap];

table = newtab; // 將該map的table屬性指向到該新陣列

if (oldtab != null)

// 如果與運算結果不為0,說明hash值大於老陣列長度(例如hash值為17)

// 此時該元素應該放置到新陣列的高位位置上

// 例:老陣列長度16,那麼新陣列長度為32,hash為17的應該放置在陣列的第17個位置上,也就是下標為16,那麼下標為16已經屬於高位了,低位是[0-15],高位是[16-31]

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}

return newtab; // 返回新陣列

}

JDK8 HashMap原始碼解析 put方法

一 概述 map的put方法接受兩個引數,key和value,該方法用於儲存鍵值對。hashmap的put方法只有一行 return putval hash key key,value,false,true 參見 hash方法解析hash方法解析可知put方法是乙個方便使用者使用的快捷方式,具體邏輯...

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...