深入解析HashMap的put方法
一.創(chuàng)建

這個相信大家也都知道怎么使用。今天就深入理解一下這里的底層原理。 首先HashMap在java中,創(chuàng)建出來是一個數(shù)組,然后數(shù)組上存放的元素是一個鏈表。
二.put()
進(jìn)入底層源碼看一下。


HashMap,在添加第一個元素的時候創(chuàng)建一個默認(rèn)2的冪的數(shù)組。也就是16,這個參數(shù)也可以你自己設(shè)置。但是一定是2的冪,假如new HashMap(30),那么只會創(chuàng)建一個32大小的數(shù)組。

計算出元素的hashcode,放到指定位置,看數(shù)組中是否有元素,無元素直接放到數(shù)組元素上,有元素的話則進(jìn)行(jdk1.8)尾插。
當(dāng)一個數(shù)組元素下的鏈表長度超過8,就會觸發(fā)treeifyBin(),

但是必須滿足,數(shù)組的長度大于64,否則,只是就行resize()擴(kuò)容,重新hash。 如果滿足鏈表長度大于8,并且數(shù)組長度大于64,此時就把鏈表轉(zhuǎn)換成紅黑樹(一種比較平衡的二叉搜索樹)。 著里再講一個設(shè)計remove()刪除元素,當(dāng)紅黑樹里的元素被刪除到小于8的時候怎么辦?其實這里有個過渡,不是8,而是如果紅黑樹里的元素刪除的小于6的時候就會觸發(fā)收縮檢測。

此時就會紅黑樹收縮回鏈表了。
三.數(shù)組初始化
前面 put里提到過,初始new HashMap() 默認(rèn)大小是16,可以指定數(shù)組大小,但是一定是2的冪。如 new HashMap(30),那么數(shù)組的大小就為32了。這個都很好理解。

四.擴(kuò)容

負(fù)載因子 = 添加的元素 / hash表的長度
這個值默認(rèn)是 0.75 ( jdk1.8)(可以根據(jù)實際需求調(diào)整,當(dāng)值越大hash沖突概率就高,查詢效率低,節(jié)省了空間,反之相反),當(dāng)超過0.75,就會觸發(fā)resize(),進(jìn)行數(shù)組的擴(kuò)容。
到此這篇關(guān)于深入解析HashMap的put方法的文章就介紹到這了,更多相關(guān)HashMap put方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
intellij idea中spring boot properties文件不能自動提示問題解決
這篇文章主要介紹了intellij idea中spring boot properties文件不能自動提示問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
詳解Spring?Security怎么從數(shù)據(jù)庫加載我們的用戶
這篇文章主要為大家介紹了Spring?Security怎么從數(shù)據(jù)庫加載我們的用戶示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Spring類型轉(zhuǎn)換 ConversionSerivce Convertor解析
這篇文章主要介紹了Spring類型轉(zhuǎn)換 ConversionSerivce Convertor的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11
java高并發(fā)的volatile與Java內(nèi)存模型詳解
這篇文章主要介紹了java高并發(fā)的volatile與Java內(nèi)存模型,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-10-10
springboot集成springsession如何實現(xiàn)分布式session共享
這篇文章主要介紹了springboot集成springsession如何實現(xiàn)分布式session共享問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

