HashMap環的形成原因

2021-09-24 19:57:23 字數 1192 閱讀 4368

那麼hashmap什麼時候進行擴容呢?當hashmap中的元素個數超過陣列大小loadfactor時,就會進行陣列擴容,loadfactor的預設值為0.75,也就是說,預設情況下,陣列大小為16,那麼當hashmap中元素個數超過160.75=12的時候,就把陣列的大小擴充套件為2×16=32,即擴大一倍,然後重新計算每個元素在陣列中的位置,而這是乙個非常消耗效能的操作,所以如果我們已經預知hashmap中元素的個數,那麼預設元素的個數能夠有效的提高hashmap的效能。比如說,我們有1000個元素new hashmap(1000), 但是理論上來講new hashmap(1024)更合適,即使是1000,hashmap也自動會將其設定為1024。 但是new hashmap(1024)還不是更合適的,因為0.751000 < 1000, 也就是說為了讓0.75 * size > 1000, 我們必須這樣new hashmap(2048)才最合適,既考慮了&的問題,也避免了resize的問題。 (有乙個小細節是不是當size達到 0.75的時候就會進行擴容,而是既要滿足當前元素插入進去的時候size大於等於0.75 並且插入的元素的位置不為空)

我們來檢視一下源**

這裡最重要的就是最後三排的**

第一步將e元素的下連線點指向新開闢的陣列對應的位置

第二步將e元素的值賦值給newtable[i]

第三步轉移下乙個元素。

轉移過後應該是這樣子的

可以發現順序被掉頭了。

假設現在有執行緒a,b。a已經完成了擴容

現在b開始擴容,擴容在迴圈兩次後會變成

可以看到有個迴圈出現,很多網友稱為:「死鎖」,實則是個死迴圈。所以產生了環。

JDK1 6 HashMap死迴圈形成原因

目錄 1.擴容形成環路 2.get key 操作死迴圈 在put元素超過負載閾值時會觸發hashmap的擴容resize操作,乙個桶的鍊錶會重新雜湊到新錶中,put 插入元素之後,負載超過閾值,觸發resize方法擴容 void addentry int hash,k key,v value,int...

癌症形成原因

我們常說的癌症,屬於腫瘤疾病。腫瘤疾病是一類很古老的疾病。早在兩千多年前的中醫典籍 黃帝內經 中,就已經記載了筋瘤 腸瘤等。直至現在,惡性腫瘤已經居於重大疾病發病率首位。腫瘤的成因分為外因和內因。外因指外界環境作用,如帶有毒性的化學氣體 內因指自身遺傳,免疫系統缺陷。惡性腫瘤是由於細胞在基因水平上無...

JDK7中HashMap鍊錶成環的原因和解決方案

jdk1.7 hashmap擴容轉移鍊錶時形成環狀鍊錶的原因 大概就是 有a b null鍊錶 有兩個執行緒,a和b a處理到a null的時候,next指向b,接著b開始處理,並已經處理完畢,即b a null 然後a又繼續執行,而next指向b,所以變為b a null 然後a的下一次迴圈的時候...