为什么按原样实施调整大小?


问题内容

HashMaps在添加新的键值对时,我有几个关于重建的问题。我将基于以下事实提出问题(对于Oracle
JVM来说是正确的,不确定它们是否对其他JVM正确):

  1. HashMap每当您将HashMap增大到大于阈值(阈值= loadFactor * numberOfEntries)时,调整大小即可重新构建以具有更大的内部表数组。新创建的Entry放在哪个存储区中无关紧要-地图仍会变大。即使所有条目都进入一个存储桶(即,它们的键hashCode()返回相同的数字)。
  2. HashMap删除数据时不会收缩。即使从中删除了所有键HashMap,其表的内部大小也不会改变。

现在的问题:

  1. 这些事实正确吗?

如果是,则:

  1. 为什么要通过这种方式实现调整大小?即使显然没有必要,是否打算增长内部表?还是一个错误?
  2. 为什么它不收缩?

问题答案:

是的,这些事实是正确的。

  1. 检测 是否“显然没有必要”将花费大量时间,并且几乎总是多余的,因为所有键都具有相同哈希码的情况很少。简而言之,您要为 每个人 付出巨额费用(跟踪一个特定的哈希码的通用性),以在极少数情况下保存一些工作,而这最终将花费比所节省的更多的钱。
  2. 因为删除是一种不太常见的操作,所以通常需要重新填充地图。如果要从较小的表开始重新映射,可以将其分配给一个,new HashMap然后将旧的分配给垃圾回收器。