为什么调整大小是按原样实现的?

2022-09-01 19:19:53

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

  1. 调整大小每次将 HashMap 增长到大于阈值时都会重新生成一个更大的内部表数组(阈值 = loadFactor*numberOfEntries)。新创建的条目放在哪个存储桶中并不重要 - Map仍将变大。即使所有条目都进入一个存储桶(即它们的键返回相同的数字)。HashMaphashCode()
  2. HashMap删除数据时不会收缩。即使从 中删除所有键,其表的内部大小也不会改变。HashMap

现在的问题是:

  1. 这些事实是否正确?

如果是,则:

  1. 为什么要以这种方式调整大小?是否打算在明显没有必要的情况下扩大内部表?还是一个错误?
  2. 为什么它不会收缩?

答案 1

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

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

答案 2