为什么调整大小的方式实现?

时间:2014-01-22 17:45:25

标签: java dictionary hashmap resize

在添加新的键值对时,我有几个关于重建HashMaps的问题。我会根据这些事实提出问题(它们适用于Oracle JVM,不确定它们是否适用于其他JVM):

  1. 每次增大HashMap大于阈值(threshold = loadFactor * numberOfEntries)时,调整重建HashMap以使内部表数组更大。新创建的条目放在哪个桶中无关紧要 - 地图仍然会变大。即使所有条目都进入一个桶(即它们的密钥'hashCode()返回相同的数字)。
  2. 删除数据时,
  3. HashMap不会缩小。即使从HashMap中删除了所有键,它的表的内部大小也不会改变。
  4. 现在问题:

    1. 这些事实是否正确?
    2. 如果是,那么:

      1. 为什么调整大小以这种方式实现?即使显然没有必要,是否有意扩大内桌?还是个bug?
      2. 为什么它不收缩?

1 个答案:

答案 0 :(得分:21)

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

  1. 检测是否“显然没有必要”将花费大量时间,而且几乎总是多余的,因为所有密钥具有相同哈希码的情况很少见。简而言之,您为每个人支付了大笔费用(跟踪一个特定哈希代码的常见情况),只是为了在极少数情况下保存一些工作,这最终会花费超过它的成本。
  2. 因为删除是一种不那么常见的操作,通常会重新填充地图。如果您想使用较小的表启动地图,您可以将其分配给new HashMap并让旧的表格进行垃圾收集。