在进行一些调试时,我意识到我使用的 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/