一道簡單的HashMap面試題所想到的...


前言

看到一個JDK1.7和JDK1.8中關於HashMap的一個面試題:

JDK1.7和1.8中HashMap中鏈表的插入的方式有什么不同?

原以為自己對HashMap的源碼理解的還算可以了,應該足夠應付面試了。但是看到這個問題自己確實也是懵逼了一下。
查了下資料,答案是JDK1.7是插入到首部,1.8改為了尾部。

 

 

既然有改變那么就想知道是為什么了,原因其實很簡答,JDK1.7中經常面試會問 並發下put 為何會導致死循環?
其實這個死循環到了JDK1.8 就不會出現了,僅僅是因為 put的后的數據放到了鏈表的尾部。

這里再回顧下JDK1.7 的循環導致死循環的問題,下面的圖是手畫圖,輔助文字說明:
JDK1.7 擴容主要代碼:

假設:HashMap中table的大小為2,有兩個元素3.7,5 這時會進行擴容,圖如下:

圖畫的很簡陋,自己看着邊看代碼邊想出來的。哈哈哈,總感覺用一些在線畫圖工作看着很別扭,而且是沒有靈魂的。(不瞎扯了,扯遠了)
這里主要是元素3,7形成了死循環,所以這里會出現問題。

而在JDK1.8 中,因為插入順序變成了尾部插入,也就是說3的next一直都會為7,元素擴容的情況下不會改變元素的順序,所以就可以避免這種死鏈了。

果然看似不起眼的設計都是有自己獨特的道理,又加深了自己對HashMap的理解了,每天都能進步一點點,真好。
感謝掘金文章的幫助:HashMap為何從頭插入改為尾插入


免責聲明!

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



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