1.資料插入的方式不同
jdk1.7用的是頭插法,而jdk1.8用的是尾插法,這是由於jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。
2.組成結構不同
jdk1.7的時候使用的是陣列+ 單鏈表的資料結構。但是在jdk1.8及之後時,使用的是陣列+鍊錶+紅黑樹的資料結構(當鍊表的深度達到8的時候,也就是預設閾值,就會自動擴容把鍊錶轉成紅黑樹的資料結構來把時間複雜度從o(n)變成o(logn)提高了效率)
3.擴容的方式不同
jdk1.7的擴容方式是將舊陣列的資料搬到新資料裡,需要重新計算hash值。計算方式是:
newindex=key.hash&(table.length-1)
jdk1.8的擴容方式 如果key.hash&oldcap==0.那麼在新陣列的下標newindex=oldindex,反之
newindex=oldcap+oldindex
這樣做的好處是不需要改變重新計算hash值。
4.下標的計算方式不同
jdk1.7中index=key.hashcode&(table.length-1)
jdk1.8中index=key.hashcode^(key.hashcode>>>16)
這樣做的目的是可以在陣列的長度比較小的時候,保證高低位bit都可以參與hash的運算當中去,增加了隨機性,使元素位置分布的更加均勻。
HashMap 底層 原理(JDK 1 8)
原來看過1.7的hashmap底層,1.8更新後也稍微看了一下,沒有進行仔細的總結,今天總結一下1.8底層的原理。本文只討論1.8的底層原理。以下全文為1.8版本的 對於hashmap的資料結構,是老生常談了,面試的時候經常會被問道。底層資料結構為陣列 鍊錶 紅黑樹,儲存的是node節點,紅黑樹是t...
jdk1 8對HashMap的改進
1,jdk1.7底層採用entry陣列 鍊錶的資料結構,而1.8採用node陣列 鍊錶 紅黑樹的資料結構。2,jdk1.7的hashmap插入新值時使用頭插法,1.8使用尾插法。使用頭插法比較快,但在多執行緒擴容時會引起倒序和閉環的問題。所以1.8就採用了尾插法。3,擴容後新錶中的索引位置計算方式不...
HashMap原始碼分析 JDK1 8
陣列 鍊錶 紅黑樹 陣列儲存元素,當有衝突時,就在該陣列位置形成乙個鍊錶,儲存衝突的元素,當鍊表元素個數大於閾值時,鍊錶就轉換為紅黑樹。transient node table transient int size int threshold final float loadfactor 預設初始容...