当前位置: 首页 > 面试题库 >

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

邹高峻
2023-03-14
问题内容

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

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

现在的问题:

  1. 这些事实正确吗?

如果是,则:

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

问题答案:

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

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


 类似资料:
  • 在添加新的键值对时,我有几个关于重建哈希映射的问题。我将根据这些事实提出问题(它们对于Oracle JVM是正确的,不确定它们对于其他JVM是否正确): 每次当HashMap增长大于阈值(阈值=加载因子*条目数)时,Resize将重建HashMap,使其具有更大的内部表数组。新创建的条目放在哪个存储桶中并不重要,Map仍然会变得更大。即使所有条目都进入一个bucket(即它们的键“返回相同的数字)

  • 你好,谢谢你花时间处理我的问题。首先让我向你介绍我的虚拟/培训项目。下面列出的类应该代表MVC模型(模型、视图、控制器)之后的程序。运行主类时,会打开FileChooser,从中可以选择. csv-File,其中包含保存为String[][]的信息。这个String[][]然后在视图类中可视化为JTable。这个JTable是带有BorderLayout的JFrame中的JPanel的一部分。中心

  • 我们在日志中看到了OutOfMemoryExceptions,它们似乎与java堆提交大小从~1G增长到~2.4G一致。尽管有错误消息,但堆空间似乎没有用完。除了抛出异常(和生成的堆转储)之外,调整大小似乎最终会成功,应用程序继续运行,没有任何问题(堆提交大小约2.4G)。 下面是日志输出的一个示例: 请注意,在OOME之前,提交的堆总数在1GB和2.4GB之间振荡。我们可以看到,它之前非常稳定在

  • 问题内容: 今天打开了LinkedHashSet源代码,发现了一些有趣的东西: 问题是:为什么当HashSet已经是Set时,为什么它们既需要“ extends HashSet”又需要“ implements Set”? 问题答案: 我问过乔什·布洛赫(Josh Bloch),他告诉我这是一个错误。很久以前,他曾经认为其中有一些价值,但是他自从“看到了光”。显然,JDK维护人员认为以后不应该撤消此

  • 问题内容: 但是,如果用前导零检查Integer,则会发现问题是在jdk7发行之前进行的,因此其研究工作量较小。但是在jdk7中,对整数进行了一些更改和添加。以下是有关jdk7的最新答案。 我有一个代码: 编译时出现错误:整数太大:09 为什么这样做呢? 同样,如果我将代码更改为: 现在输出是10 为什么给输出10而不是12? 问题答案: 开头的数字被认为是八 - 9不是一个八进制数字(但(传统)