深入解析HashMap的put方法
一.創(chuàng)建
這個相信大家也都知道怎么使用。今天就深入理解一下這里的底層原理。 首先HashMap在java中,創(chuàng)建出來是一個數(shù)組,然后數(shù)組上存放的元素是一個鏈表。
二.put()
進入底層源碼看一下。
HashMap,在添加第一個元素的時候創(chuàng)建一個默認(rèn)2的冪的數(shù)組。也就是16,這個參數(shù)也可以你自己設(shè)置。但是一定是2的冪,假如new HashMap(30),那么只會創(chuàng)建一個32大小的數(shù)組。
計算出元素的hashcode,放到指定位置,看數(shù)組中是否有元素,無元素直接放到數(shù)組元素上,有元素的話則進行(jdk1.8)尾插。
當(dāng)一個數(shù)組元素下的鏈表長度超過8,就會觸發(fā)treeifyBin(),
但是必須滿足,數(shù)組的長度大于64,否則,只是就行resize()擴容,重新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了。這個都很好理解。
四.擴容
負(fù)載因子 = 添加的元素 / hash表的長度
這個值默認(rèn)是 0.75 ( jdk1.8)(可以根據(jù)實際需求調(diào)整,當(dāng)值越大hash沖突概率就高,查詢效率低,節(jié)省了空間,反之相反),當(dāng)超過0.75,就會觸發(fā)resize(),進行數(shù)組的擴容。
到此這篇關(guān)于深入解析HashMap的put方法的文章就介紹到這了,更多相關(guān)HashMap put方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud中Eureka開啟密碼認(rèn)證的實例
這篇文章主要介紹了Spring Cloud中Eureka開啟密碼認(rèn)證的實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Spring Shell應(yīng)用程序開發(fā)流程解析
這篇文章主要介紹了Spring Shell應(yīng)用程序開發(fā)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10SpringBoot Session共享實現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式
這篇文章主要介紹了SpringCloud feign微服務(wù)調(diào)用之間的異常處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向
這篇文章主要介紹了詳解spring mvc 請求轉(zhuǎn)發(fā)和重定向,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02redis setIfAbsent和setnx的區(qū)別與使用說明
這篇文章主要介紹了redis setIfAbsent和setnx的區(qū)別與使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java基礎(chǔ)之面向?qū)ο髾C制(多態(tài)、繼承)底層實現(xiàn)
這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C制(多態(tài)、繼承)底層實現(xiàn),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04