HashMap 1 7和1 8的區別

2021-10-03 02:15:59 字數 555 閱讀 6262

底層資料結構不一樣,1.7是陣列+鍊錶1.8則是陣列+鍊錶+紅黑樹結構(當鍊表長度大於8,轉為紅黑樹)。

jdk1.7用的是頭插法,而jdk1.8及之後使用的都是尾插法,那麼他們為什麼要這樣做呢?因為jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。

擴容後資料儲存位置的計算方式也不一樣:在jdk1.7的時候是直接用hash值和需要擴容的二進位制數進行&;而在jdk1.8的時候直接用了jdk1.7的時候計算的規律,也就是擴容前的原始位置+擴容的大小值=jdk1.8的計算方式,而不再是jdk1.7的那種異或的方法。

在擴容的時候:1.7在插入資料之前擴容,而1.8插入資料成功之後擴容。

jdk1.8中resize()方法在表為空時,建立表;在表不為空時,擴容;而jdk1.7中resize()方法負責擴容,inflatetable()負責建立表。

參考文章:

hashmap1 7以及1 8的一些理解

hashmap的put操作 根據key經過擾動函式 異或和取餘的操作 得到乙個hash值,然後根據這個hash進行hash n 1 得到乙個索引值,然後判斷當前索引值的陣列位置是否有有元素,如果有元素,再根據equals判斷連個元素是否相同,相同的話,則直接覆蓋當前元素,不相同的話,則產生hash衝...

HashMap 1 7 原始碼講解

1 hashseed 用於鍵的雜湊碼計算上,用於減少雜湊衝突。通過下面所述的inithashseedasneeded方法來進行初始化 2 threshold 表示可以存放的最大量,它的值為loadfactory 陣列容量,但是存在最大值為1 30 1 即2 30 1 3 loadfactory 負載...

JDK1 8和1 7下的HashMap的區別

一 1.8之前雜湊表主要由陣列加上鍊表組成 拉鍊法解決衝突 1.8 之後由陣列和鍊錶或者紅黑樹組成,當滿足以下兩個條件的時候,鍊錶會轉換成紅黑樹。鍊錶的長度大於8 陣列的長度大於64 二 hash 變了,變的更加簡單,衝突更少了。如下是1.8的方法 static final int hash obj...