HashMap原始碼(二)

2022-07-22 09:33:06 字數 1217 閱讀 6405

final node resize() 

/*初始化新的table長度為之前的2倍,並判斷是否小於2的三十次方 且 之前的table長度是否大於16

如果都是則將擴容門檻值擴大為之前的2倍

??? 這裡為什麼要判斷 之前的table長度是否大於16 才擴容?

*/else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}// 執行到這個else if 說明老陣列沒有任何元素

// 如果老陣列的擴容閥值大於0,那麼設定新陣列的容量為該閥值

// 這一步也就意味著構造該map的時候,指定了初始化容量。

else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

// 如果擴容閥值為0 (ps2的情況)

if (newthr == 0)

threshold = newthr; // 設定map的擴容閥值為 新的閥值

@suppresswarnings()

// 建立新的陣列(對於第一次新增元素,那麼這個陣列就是第乙個陣列;對於存在oldtab的時候,那麼這個陣列就是要需要擴容到的新陣列)

node newtab = (node)new node[newcap];

table = newtab; // 將該map的table屬性指向到該新陣列

if (oldtab != null)

// 如果與運算結果不為0,說明hash值大於老陣列長度(例如hash值為17)

// 此時該元素應該放置到新陣列的高位位置上

// 例:老陣列長度16,那麼新陣列長度為32,hash為17的應該放置在陣列的第17個位置上,也就是下標為16,那麼下標為16已經屬於高位了,低位是[0-15],高位是[16-31]

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}

return newtab; // 返回新陣列

}

HashMap原始碼系列 HashMap的屬性

public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...

HashMap原始碼分析

public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...