java - 为什么HashMap中有这么多空映射?

标签 java collections

在进行一些调试时,我意识到我使用的 HashMap 的表有很多空映射,这是为什么?

例如,HashMap 的大小为 471.189,而它的大小为 table=HashMap$Entry<K, V>[1048576] ,大约是所需的 2.2 倍。

最佳答案

hash table (wikipedia) 的理论实现将创建比必要的存储空间更大的空间,以减少哈希冲突的机会。将键值添加到哈希时,将进行计算(在键值的 hashCode() 上)以确定键将存储在哈希表中的位置。这就是哈希表概念使用起来很快的原因,而且哈希和哈希函数越好,冲突就越少,系统运行速度就越快。

哈希表中的空白空间越大,发生冲突的机会就越小。

如果发生冲突,有一个系统允许以不同的方式存储值,仍然很快,但并不完美。

底线是哈希表是性能和“浪费”空间之间的权衡和妥协。

当你调试时,你会看到 HashMap 中有空白空间,这是正常的,甚至是“健康的”。

当哈希表(HashMap)被填满时,它会将数据“重新映射”到更大的哈希表中。这种重新映射可能会很慢,因此,如果您知道哈希表将增长到特定大小,您可能应该使用 capacity argument on the constructor 预先分配空间。

关于java - 为什么HashMap中有这么多空映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26180632/

相关文章:

c# - 如何创建无重复的ConcurrentQueue?

java - 使用 maven tycho 构建 list 条目 Bundle-ClassPath,该 list 条目由 maven-dependency-plugin 下载

java - 为什么这个类不适合 Junit 测试,我该如何改进它?

java - Linux命令执行后读取输出将陷入无限循环

javascript - 通过页面模板 Meteor 操作集合数组?

Java 集合。添加(E obj),但删除(Object obj)

java - 它们是 Java map 的任何体面的磁盘实现吗?

java - Json、Java、解析(如何只获取json的一部分

java - 如何在 Java 中设置尊重用户操作系统设置的日期和时间格式

hibernate - 在 HQL 中选择集合