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