在进行一些调试时,我意识到我使用的HashMap表有很多空映射,为什么会这样?
例如,HashMap的大小为471.189,当它有table=HashMap$Entry<K, V>[1048576]
时,大约是所需数量的2.2倍。
答案 0 :(得分:4)
hash table (wikipedia)的理论实现将创建一个大于必要的存储空间,以减少哈希冲突的可能性。当将键值添加到散列时,进行计算(在键值的hashCode()
上)以确定将在散列表中存储密钥的位置。这就是使哈希表概念快速使用的原因,哈希和哈希函数越好,冲突越少,系统运行得越快。
哈希表中的空白空间越大,发生冲突的可能性就越小。
如果发生碰撞,就会有一个系统允许以不同的方式存储值,但仍然很快,但并不完美。
最重要的是,哈希表是性能和“浪费”空间之间的折衷,折衷。
调试时,你会看到HashMap中的空白区域,这是正常的,甚至是“健康的”。
当哈希表(HashMap)被填满时,它会将数据“重新映射”到更大的哈希表中。这种重新映射可能很慢,因此,如果您知道您的哈希表将增长到特定大小,您应该使用capacity argument on the constructor预先分配空间