HashMap之?dāng)U容機制

首先要了解HashMap的擴容過程,我們就得了解一些HashMap中的變量:

Node<K,V>:鏈表節(jié)點,包含了key、value、hash、next指針?biāo)膫€元素
table:Node<K,V>類型的數(shù)組,里面的元素是鏈表,用于存放HashMap元素的實體
size:記錄了放入HashMap的元素個數(shù)
loadFactor:負載因子
threshold:擴容的閾值,決定了HashMap何時擴容,以及擴容后的大小,一般等于,等于 table * loadFactor

何時進行擴容?
HashMap使用的是懶加載,構(gòu)造完HashMap對象后,只要不進行put 方法插入元素之前,HashMap并不會去初始化或者擴容table。

當(dāng)首次調(diào)用put方法時,HashMap會發(fā)現(xiàn)table為空然后調(diào)用resize方法進行初始化
,當(dāng)添加完元素后,如果HashMap發(fā)現(xiàn)size(元素總數(shù))大于threshold(閾值),則會調(diào)用resize方法進行擴容

擴容過程:

  • 若threshold(閾值)不為空,table的首次初始化大小為閾值,否則初始化為缺省值大小16
  • 默認的負載因子大小為0.75,當(dāng)一個map填滿了75%的bucket時候,就會擴容,擴容后的table大小變?yōu)樵瓉淼膬杀?/li>
  • 假設(shè)擴容前的table大小為2的N次方,有上述put方法解析可知,元素的table索引為其hash值的后N位確定
  • 擴容后的table大小即為2的N+1次方,則其中元素的table索引為其hash值的后N+1位確定,比原來多了一位
  • 重新調(diào)整map的大小,并將原來的對象放入新的bucket數(shù)組中。這個過程叫作rehashing

因此,table中的元素只有兩種情況:
元素hash值第N+1位為0:不需要進行位置調(diào)整
元素hash值第N+1位為1:調(diào)整至原索引的兩倍位置
擴容或初始化完成后,resize方法返回新的table

參考:
Java HashMap的擴容


技術(shù)討論 & 疑問建議 & 個人博客

版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議,轉(zhuǎn)載請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容