我有几个关于重建的问题HashMaps
添加新的键值对时。我将根据这些事实提出问题(它们对于 Oracle JVM 来说是正确的,不确定它们对于其他 JVM 是否正确):
- 调整重建大小
HashMap
每次当您将 HashMap 增长到大于阈值(阈值 = loadFactor*numberOfEntries)时,都会有一个更大的内表数组。新创建的 Entry 放在哪个存储桶中并不重要 - Map 仍然会变大。即使所有条目都进入一个存储桶(即它们的密钥)hashCode()
返回相同的数字)。
-
HashMap
删除数据时不会缩小。即使所有钥匙都被移除HashMap
,它的表的内部大小不会改变。
现在的问题是:
- 这些事实正确吗?
如果是,那么:
- 为什么要以这种方式调整大小?即使明显没有必要,是否仍打算增加内表?还是一个错误?
- 为什么它不收缩?
是的,这些事实是正确的。
-
检测是否“显然没有必要”会花费大量时间,而且几乎总是多余的,因为所有键具有相同哈希码的情况很少见。简而言之,您正在支付一笔巨额费用(跟踪一个特定哈希码的常见程度)大家只是为了在极少数情况下节省一些工作,这最终会导致成本超过节省的成本。
- 因为删除是一个不太常见的操作,并且通常会随后重新填充地图。如果你想用一个较小的表重新开始地图,你可以将它分配给一个
new HashMap
并让旧的被垃圾收集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)