Object 中的 equals 实现

The equals implementation in Object

提问人:Hamza Belmellouki 提问时间:9/25/2018 更新时间:9/25/2018 访问量:2393

问:

我正在阅读 Java 中的 equals 方法,我听到有人说测试引用相等性(它们是否是同一个对象)。 测试价值相等(它们在逻辑上是否“相等”)。==.equals()

我相信这是真的,但是,如果你看一下 的源代码,它只是服从.equals()==

在 Object 类中:

    public boolean equals(Object obj) {
    return (this == obj);
}

现在我很困惑。我看到的是我们正在测试当前对象是否具有对显式参数的相同引用。它是否测试参考相等或价值相等?

Java 等于 平等

评论

3赞 Eran 9/25/2018
equals旨在在Object
1赞 T.J. Crowder 9/25/2018
你读过文档吗?关于为什么使用似乎很清楚......Object#equals==
0赞 Hamza Belmellouki 9/25/2018
是的,我知道,但我想知道字符串比较,我看到人们一直在使用它。

答:

8赞 T.J. Crowder 9/25/2018 #1

Javadoc 中

类的 equals 方法在对象上实现了最具区分性的等价关系;也就是说,对于任何非引用值 和 ,此方法返回当且仅当 和 引用相同的对象(具有值)。Objectnullxytruexyx == ytrue

Object作为最终的基类,这是它唯一可以提供的定义。没有要跨实例比较的字段,因此实例只能等于自身。equals


在评论中,你说:

我想知道字符串比较,我看到人们一直在使用它

您的问题询问的是 ,而不是 。 覆盖 ,因为 的定义不适合 。因此,定义自己的(与实现所需的语义保持一致)。ObjectStringStringequalsObjectequalsStringStringequals

评论

0赞 Mena 9/25/2018
平心而论,文档并没有明确说明需要覆盖该方法,尽管简单的谷歌搜索就可以解决 OP 的困境。
0赞 T.J. Crowder 9/25/2018
@Mena - 在文档中对此进行说明不会有什么坏处,但当然,您不必覆盖它。这就像任何其他方法一样:如果超类的版本适用于您的类,则可以不理会它。对于很多类来说,的定义就好了。:-)Object
0赞 Mena 9/25/2018
完全同意,您不必覆盖它 - 您可能需要覆盖它。只是文档没有说明覆盖是实现非基于引用的相等性检查的理想方法(同样,这很容易自己弄清楚)。所以是的,“不会受到伤害”,但很好。
1赞 GhostCat 9/25/2018 #2

对象没有可以与之比较的值。

但为了有意义,它必须为 equals() 或 hashCode() 等方法提供实现。

因此,准确地说:从 Object 派生的类应该覆盖 equals(),以防它们用“值语义”替换引用相等。