1. 程式人生 > >一道簡單的HashMap面試題所想到的...

一道簡單的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為何從頭插入改為尾插入