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

dee*_*son 24 java dictionary resize hashmap

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

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

现在的问题是:

  1. 这些事实是否正确?

如果是,那么:

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

Lou*_*man 21

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

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

  • 这个问题没有意义."表桶被添加"是"hashmap增长"的同义词.哈希映射的用户无法"添加表桶"; 当有更多条目时添加表桶. (3认同)
  • 通过在添加条目时调整大小,我们实际上是在每个bucket_的_average条目数超过一定数量时调整表的大小.在实践中发生的事情是原始表中的每个桶在新表中被分成两个桶,(平均)一个新桶中有一半,另一个桶中有一半.没有多少桶是非空的,与每桶的平均条目数一样多. (3认同)