为什么我不能只比较两个对象的hashCode以确定它们是否相等?

时间:2015-04-18 07:40:52

标签: java hash equals hashcode

为什么Eclipse实现的equals方法比较每个值,不比较两个对象的hashCodes更简单吗?

据我所知:

  • hashCode始终为同一输入生成相同的哈希
  • 因此,如果两个对象相等,则它们应具有相同的哈希值
  • 如果相同的对象具有相同的散列,我可以检查散列以确定对象是否相等

编辑:相关问题,为什么在实现equals时总是实现hashCode,如果hashCode实际上不需要等于?

3 个答案:

答案 0 :(得分:4)

  

hashCode始终为同一输入生成相同的哈希

正确。

  

因此,如果两个对象相等,则它们应该具有相同的散列

正确。

  

如果相等的对象具有相同的散列,我可以检查散列以确定对象是否相等

非sequitur。不相等的对象也可以具有相同的哈希码。这就是哈希码的目的。

  

相关问题,为什么在实现equals时总是实现hashCode,如果hashCode实际上不需要等于?

因为在HashMap, HashSet,和朋友中需要哈希。如果您认为您的对象永远不会被如此使用,请不要覆盖它,并祝你好运。

答案 1 :(得分:1)

为了补充@EJP's answer,这是.hashCode()的完全有效但无用的实现:

@Override
public int hashCode()
{
    return 42; // The Answer
}

答案 2 :(得分:0)

用非常简单的术语来说:虽然每只松鼠都是动物,但并不是每只动物都是松鼠。 hashCode通常用于快速查找 - 它应该是高效的,它应该在查找表中统一分配数据 - 请参阅here。但是哈希函数可以产生冲突,这就是为什么它不应该被用作验证对象相等性的手段。

这一切都非常依赖于hashCode的实现 - 你也可以在fge的答案中看到。

为什么在重写equals时通常需要重新实现它们:它们在存储和从集合中检索对象时使用(例如HashMap)。 hashCode确定映射中将插入对象的位置,而equals用于标识冲突桶内的对象。