繁体   English   中英

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

[英]Why can't I just compare the hashCode of two objects in order to find out if they are equal or not?

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

据我所知:

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

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

hashCode总是为相同的输入生成相同的哈希

正确。

因此,如果两个对象相等,则它们应具有相同的哈希值

正确。

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

不合逻辑的推论。 不相等的对象也可以具有相同的哈希码。 这就是哈希码的目的。

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

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

为了补充@EJP的答案 ,这是.hashCode()一个完全有效但无用的实现:

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

简单地说:每只松鼠都是动物,但并非每只动物都是松鼠。 hashCode通常用于快速查找-它应该高效并且应该在查找表中均匀地分布数据-请参见此处 但是哈希函数会产生冲突,这就是为什么不应将其用作验证对象相等性的方法。

这完全取决于hashCode的实现-您也可以在fge的答案中看到。

关于为什么当您覆盖equals时通常需要重新实现它的原因:当从集合(例如HashMap)中存储和检索对象时,都使用它们。 hashCode确定地图上将插入对象的位置,而equals用于标识碰撞桶内的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM