當散列表中的條目數超過了負載因子和當前容量的乘積時,容量如何增加?散列表的負載因子和容量
3
A
回答
5
它取決於底層的實現。例如,在HashMap中,底層存儲是一個數組:
transient Entry[] table;
Entry對象包含鍵和值。當容量不足時(正如您所說的,超過負載因子和當前容量的乘積),將創建一個新數組並將舊值複製到其中。
查看OpenJdk 7的sourcecode of HashMap並查找void resize(int newCapacity)
。在該方法中最重要的行是:
Entry[] newTable = new Entry[newCapacity]; //create the new table
transfer(newTable); //transfer and rehash the data
table = newTable; //from now on use the new table
threshold = (int)(newCapacity * loadFactor); //compute the new threshold
threshold
是可再次增加尺寸之前被包含的元素的最大數量。 transfer()
也會重新排列元素,因此與原始位置相比,元素可能會存儲在不同的數組索引中。您可以查看代碼,閱讀起來非常簡單。
0
加載因子是衡量散列表在其容量自動增加之前能夠獲得的滿量程。當哈希表中的條目數超過負載因子與當前容量的乘積時,通過調用rehash方法增加容量。
這裏是翻版方法
int oldCapacity = table.length;
Entry[] oldMap = table;
int newCapacity = oldCapacity * 2 + 1;
Entry[] newMap = new Entry[newCapacity];
一瞥正如你可以看到它的實際倍增入口[]一旦負載因數和電流容量的乘積增加了閾值的能力。
查看hashtable的rehash方法以獲取更多詳細信息。
0
當您創建它,使用默認的尺寸和負荷因子創建一個新的哈希表。
源代碼
public Hashtable() {
this(11, 0.75f);
}
當添加元素進入它
它檢查
if (count >= threshold) {
}
分別創建新的數組和作爲拷貝所述Stivlo。
private transient Entry [] table;
相關問題
- 1. 更改Scala的默認容量/負載因子mutable.HashMap
- 2. Perl - 散列散列(散列和標量)?
- 3. 爲什麼Hashtable的負載因子與CLRS書中描述的負載因子不一致?
- 4. HashSet的負載因數
- 5. 雙因素和盲散列的ASP.NET MVC4
- 6. 負載的TreeView從列表
- 7. .net哈希表插入失敗。負載因子過高
- 8. .NET哈希表:如何模擬「負載因子太高」異常
- 9. Spring RMI的容錯和負載均衡
- 10. 散列和數組的Perl散列 - 打印數組內容
- 11. Iphone - 使用[myString散列]的NSString散列給我負值
- 12. 創建您自己的散列表和散列表
- 13. 如果什麼HashMap的負載因子值大於1個
- 14. HashSet中填充比率或負載因子概念的需求
- 15. 負載測試和內容文件
- 16. jQuery的負載變量將不會加載內容
- 17. 負載陣列
- 18. 負載陣列
- 19. 找到加載的散列表
- 20. 中心容器和使用負餘量
- 21. 負載子實體
- 22. 負載孩子EF5
- 23. SSIS增量負載
- 24. 如何用修正因子創建散列的差異?
- 25. 使用打開和關閉散列表散列到7-bucket表
- 26. 負載表 - jQuery的
- 27. Spring Security BCrypt密碼編碼器 - 工作負載因子
- 28. 散列證書的內容
- 29. 負載表C
- 30. SSIS中的增量負載