1、hashmap在jdk1.7底層儲存為 【陣列+鍊錶】
2、hashmap在jdk1.8底層儲存為 【陣列+鍊錶/二叉樹】
接下來我們以jdk1.8為例分析hashmap在資料達到多少時實現擴容,何時鍊錶轉換成紅黑樹:
首先先明白以下定義:
1、插入資料(k,v)的數量(key去重):size
2、向hashmap中插入資料時陣列的初始長度為:16(假設用a來表示)
3、負載因子:預設值為0.75(計算閾值的引數) (假設用b來表示)
4、閾值: 當size達到閾值時,開始考慮擴容
閾值=陣列的長度*負載因子(a*b=12),初始的閾值為12
答:1、當插入的資料達到當前計算出的閾值時,再繼續插入資料到非空下標陣列格仔時即擴容
如圖:(1)size=閾值12,第13條資料無論插入到(index=3,5,12,13,14)哪個下標下,都會導致陣列的擴容;
(2)但第13條資料插入到空陣列下標格仔下,不發生擴容,直至插入到非空下標陣列格仔開始擴容。
2、當單個下標陣列格仔上的煉表達到8時,並且陣列長度不超過64時,陣列擴容
如圖:只要一根鏈條上資料達到8時,繼續存放該鏈條上的第9條資料時,若陣列長度沒有達到64,就擴容。
答:當單個下標陣列格仔鍊錶長度達到8時,並且陣列長度達到64時,繼續往這個下標陣列格仔中存資料,當前下標陣列格仔鍊錶變為二叉樹結構。
如圖補:當儲存結構為鍊錶時最大長度為10
假設初始化陣列長度為16,乙個鏈條連續存入8條資料
存入第9條資料時,陣列長度擴容至32;
存入第10條資料時,陣列長度擴容至64;
存入第11條資料時,儲存結構由鍊錶轉化為二叉樹;
HashMap底層(1 7和1 8)的儲存原理
首先說一下jdk1.7版本的存放原理 當例項化後,底層會直接建立乙個長度為16的一維陣列entry table 然後,說一下新增元素時,呼叫put方法 三種情況儲存 方式一 底層根據key計算hash值,計算出索引位置,檢視當前位置是否有值,如果沒有值,直接存放。情況二 當計算出的索引位置,有值時 ...
HashMap的底層原理
簡單來說,hashmap的實現是 陣列 鍊錶 陣列是hashmap的主體,鍊錶則是主要為了解決雜湊衝突而設立的。對於查詢來說,陣列更加的方便 對於刪除,修改,鍊錶更加的方便。hash表的本質就是乙個陣列,陣列中的每乙個元素被稱為乙個箱子 bin 箱子中存放的是鍵值對。儲存過程如下 根據k值計算他的雜...
HashMap的底層原理
在jdk1.6和jdk1.7中hashmap是桶加鍊表的實現方式.hashmap的底層結構就是乙個陣列,陣列中每乙個元素又是乙個鍊錶.當新增乙個元素 key value 的時候,根據key的hash值 或者說呼叫key的hashcode方法 來確定插入到哪乙個桶中 確定插入陣列中的位置 當桶中有多個...