为什么按原样实施调整大小?
问题内容:
HashMaps
在添加新的键值对时,我有几个关于重建的问题。我将基于以下事实提出问题(对于Oracle
JVM来说是正确的,不确定它们是否对其他JVM正确):
HashMap
每当您将HashMap增大到大于阈值(阈值= loadFactor * numberOfEntries)时,调整大小即可重新构建以具有更大的内部表数组。新创建的Entry放在哪个存储区中无关紧要-地图仍会变大。即使所有条目都进入一个存储桶(即,它们的键hashCode()
返回相同的数字)。HashMap
删除数据时不会收缩。即使从中删除了所有键HashMap
,其表的内部大小也不会改变。
现在的问题:
- 这些事实正确吗?
如果是,则:
- 为什么要通过这种方式实现调整大小?即使显然没有必要,是否打算增长内部表?还是一个错误?
- 为什么它不收缩?
问题答案:
是的,这些事实是正确的。
- 检测 是否“显然没有必要”将花费大量时间,并且几乎总是多余的,因为所有键都具有相同哈希码的情况很少。简而言之,您要为 每个人 付出巨额费用(跟踪一个特定的哈希码的通用性),以在极少数情况下保存一些工作,而这最终将花费比所节省的更多的钱。
- 因为删除是一种不太常见的操作,所以通常需要重新填充地图。如果要从较小的表开始重新映射,可以将其分配给一个,
new HashMap
然后将旧的分配给垃圾回收器。