默認情況下HashMap的容量是16,如果用戶通過構造函數指定了一個數字作為容量,那么Hash會選擇大於該數字的第一個2的冪作為容量。(3->4、7->8、9->16)
如果map在put的時候發現超過闕值的時候就會產生擴容:
闕值 = 負載因子 * 容量
threshold = loadFactor * capacity
所以我們知道map里存放的個數時候,new的構造函數的設置值應該利用公式 = (需要存儲的個數 / 負載因子)+ 1
比如map里要存放16個元素
(16 / 0.75) + 1 = 22
Map<String, String> map = new HashMap<String, String>(22); // int n = cap - 1; // n |= n >>> 1; // n |= n >>> 2; // n |= n >>> 4; // n |= n >>> 8; // n |= n >>> 16; // return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; map容量變成24 闕值 = 24 * 0.75 = 18 此時我們存放16個元素就不會觸發擴容
