深入解析HashMap的put方法
一.創(chuàng)建
這個相信大家也都知道怎么使用。今天就深入理解一下這里的底層原理。 首先HashMap在java中,創(chuàng)建出來是一個數(shù)組,然后數(shù)組上存放的元素是一個鏈表。
二.put()
進入底層源碼看一下。
HashMap,在添加第一個元素的時候創(chuàng)建一個默認2的冪的數(shù)組。也就是16,這個參數(shù)也可以你自己設置。但是一定是2的冪,假如new HashMap(30),那么只會創(chuàng)建一個32大小的數(shù)組。
計算出元素的hashcode,放到指定位置,看數(shù)組中是否有元素,無元素直接放到數(shù)組元素上,有元素的話則進行(jdk1.8)尾插。
當一個數(shù)組元素下的鏈表長度超過8,就會觸發(fā)treeifyBin(),
但是必須滿足,數(shù)組的長度大于64,否則,只是就行resize()擴容,重新hash。 如果滿足鏈表長度大于8,并且數(shù)組長度大于64,此時就把鏈表轉換成紅黑樹(一種比較平衡的二叉搜索樹)。 著里再講一個設計remove()刪除元素,當紅黑樹里的元素被刪除到小于8的時候怎么辦?其實這里有個過渡,不是8,而是如果紅黑樹里的元素刪除的小于6的時候就會觸發(fā)收縮檢測。
此時就會紅黑樹收縮回鏈表了。
三.數(shù)組初始化
前面 put里提到過,初始new HashMap() 默認大小是16,可以指定數(shù)組大小,但是一定是2的冪。如 new HashMap(30),那么數(shù)組的大小就為32了。這個都很好理解。
四.擴容
負載因子 = 添加的元素 / hash表的長度
這個值默認是 0.75 ( jdk1.8)(可以根據(jù)實際需求調整,當值越大hash沖突概率就高,查詢效率低,節(jié)省了空間,反之相反),當超過0.75,就會觸發(fā)resize(),進行數(shù)組的擴容。
到此這篇關于深入解析HashMap的put方法的文章就介紹到這了,更多相關HashMap put方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot Session共享實現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01SpringCloud feign微服務調用之間的異常處理方式
這篇文章主要介紹了SpringCloud feign微服務調用之間的異常處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06redis setIfAbsent和setnx的區(qū)別與使用說明
這篇文章主要介紹了redis setIfAbsent和setnx的區(qū)別與使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java基礎之面向對象機制(多態(tài)、繼承)底層實現(xiàn)
這篇文章主要介紹了Java基礎之面向對象機制(多態(tài)、繼承)底層實現(xiàn),文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04