HashMap之1.7和1.8的區別

參考博客:https://blog.csdn.net/carson_ho/article/details/79373026

圖片轉自:https://blog.csdn.net/carson_ho/article/details/79373134

HashMap是我們開發中經常使用到的集合,jdk1.8相對於1.7底層實現發生了一些改變。1.8主要優化減少了Hash衝突 ,提高哈希表的存、取效率。

  1. 底層數據結構不一樣,1.7是數組+鏈表,1.8則是數組+鏈表+紅黑樹結構(當鏈表長度大於8,轉爲紅黑樹)。
  2. JDK1.8中resize()方法在表爲空時,創建表;在表不爲空時,擴容;而JDK1.7中resize()方法負責擴容,inflateTable()負責創建表。
  3.  1.8中沒有區分鍵爲null的情況,而1.7版本中對於鍵爲null的情況調用putForNullKey()方法。但是兩個版本中如果鍵爲null,那麼調用hash()方法得到的都將是0,所以鍵爲null的元素都始終位於哈希表table【0】中。
  4. 當1.8中的桶中元素處於鏈表的情況,遍歷的同時最後如果沒有匹配的,直接將節點添加到鏈表尾部;而1.7在遍歷的同時沒有添加數據,而是另外調用了addEntry()方法,將節點添加到鏈表頭部。
  5. 1.7中新增節點採用頭插法,1.8中新增節點採用尾插法。這也是爲什麼1.8不容易出現環型鏈表的原因。
  6. 1.7中是通過更改hashSeed值修改節點的hash值從而達到rehash時的鏈表分散,而1.8中鍵的hash值不會改變,rehash時根據(hash&oldCap)==0將鏈表分散。
  7.  1.8rehash時保證原鏈表的順序,而1.7中rehash時有可能改變鏈表的順序(頭插法導致)。
  8. 在擴容的時候:1.7在插入數據之前擴容,而1.8插入數據成功之後擴容。

end-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章