当散列表中的条目数超过了负载因子和当前容量的乘积时,容量如何增加?散列表的负载因子和容量
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中的增量负载