前言
看到一個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為何從頭插入改為尾插入