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

2021-09-07 20:32:35 字數 778 閱讀 7148

看到乙個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 這時會進行擴容,圖如下:

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

果然看似不起眼的設計都是有自己獨特的道理,又加深了自己對hashmap的理解了,每天都能進步一點點,真好。

感謝掘金文章的幫助:hashmap為何從頭插入改為尾插入

一道簡單的面試題

設初始區間為seq0 0.0,1,0 產生乙個隨機數插入原來區間形成新區間seq1 假設產生0.7,則seq1 0.0,0.7,1.0 對seq1中的區間的子相鄰區間 如 0.0,0.7 和 0.7,1.0 取最大值,再次在此區間產生隨機數並插入.如此不斷重複。演算法很簡單,維護乙個鍊錶即可。每產生...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...