jdk1.8對HashMap的改進


1,jdk1.7底層采用entry數組+鏈表的數據結構,而1.8采用node數組+鏈表/紅黑樹的數據結構。

2,jdk1.7的HashMap插入新值時使用頭插法,1.8使用尾插法。

使用頭插法比較快,但在多線程擴容時會引起倒序和閉環的問題。所以1.8就采用了尾插法。

3,擴容后新表中的索引位置計算方式不同,jdk1.7擴容時是將舊表元素的所有數據重新進行哈希計算,即hashCode & (length-1)。而1.8中擴容時只需將hashCode和老數組長度做與運算判斷是0還是1,是0的話索引不變,是1的話索引變為老索引位置+老數組長度。

 

擴容為什么是2的n次方

1,插入新元素確定索引位置的時候是采用key的hashCode和數組長度做與運算,即hashCode&(length-1)。模擬的是取模運算,但速度比取模快很多,要保證這種運算的正確性,必須要求數組的長度是2的n次方。

2,在擴容時進行新索引位置的計算時也要求數組長度是2的n次方。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM