为什么HashMap.Entry类有哈希字段?

时间:2018-03-31 12:12:34

标签: java hashmap

当我们添加一个条目或检索一个条目到HashMap时,密钥上的equals()就足以在桶的特定索引中找到它。为什么hash也被存储和检查?

2 个答案:

答案 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)

HashMapMap的一个实现,它维护一个条目表,并根据它们的哈希码组织相关键和值的引用。该实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶中正确地分散了元素。

请参阅:

  

{{3}}

虽然equals()足以(最终)找到密钥是正确的,但这不会提供恒定的时间性能。

还有Map的其他实现不使用哈希码。