【问题标题】:Why can't I just compare the hashCode of two objects in order to find out if they are equal or not?为什么我不能只比较两个对象的 hashCode 以确定它们是否相等?
【发布时间】:2015-04-18 16:43:09
【问题描述】:

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

据我所知:

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

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

【问题讨论】:

    标签: java hash equals hashcode


    【解决方案1】:

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

    正确。

    所以如果两个对象相等,它们应该有相同的哈希

    正确。

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        相关资源
        最近更新 更多