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...