当我们添加一个条目或检索一个条目到HashMap时,密钥上的equals()就足以在桶的特定索引中找到它。为什么hash也被存储和检查?
答案 0 :(得分:2)
在执行查找和删除等操作时,无需重新计算键的哈希值(在条目中)。出于性能原因存储它们。
计算密钥的哈希值可能很昂贵。
当条目与主数组大小的比率超过某个值("加载因子")时,HashMap
实现会扩展数组。发生这种情况时,需要将所有现有条目重新分配到新的哈希链...基于输入键'有价值。哈希值存储在Entry
对象中,因此每次需要重新分配条目时都不必重新计算它们。
存储了哈希码值后,它们还可用于加速查找...
// Version #1
if (node.key.equals(keyToTest)) {
...
}
// Versions #2
if (node.hashValue == hashValueToTest && node.key.equals(keyToTest)) {
...
}
如果key.equals
方法很昂贵,那么您可以节省一些时间(平均),避免在哈希值不匹配时调用它。 (但是当他们做匹配时,无论如何都必须进行调用!)
所以,实际上,存储哈希值的原因有两个。
答案 1 :(得分:1)
HashMap
是Map
的一个实现,它维护一个条目表,并根据它们的哈希码组织相关键和值的引用。该实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶中正确地分散了元素。
请参阅:
{{3}}
虽然equals()
足以(最终)找到密钥是正确的,但这不会提供恒定的时间性能。
还有Map
的其他实现不使用哈希码。