我正在阅读有关Java中的equals方法的信息,听说有人说==
测试引用是否相等(它们是否是同一对象)。 .equals()
测试值是否相等(在逻辑上是否为“相等”)。
我相信这是事实,但是,如果您查看.equals()
的源代码,它只是顺应==
来自Object类:
public boolean equals(Object obj) {
return (this == obj);
}
现在我很困惑。我看到的是我们正在测试当前对象是否具有对显式参数的相同引用。它是否测试引用相等性或值相等性?
答案 0 :(得分:5)
来自the Javadoc:
类
Object
的equals方法在对象上实现了最有区别的对等关系;也就是说,对于任何非null
参考值x
和y
,当且仅当引用true
和x
时,此方法才返回y
到同一对象(x == y
的值为true
)。
Object
是最终的基类,这是它可以提供的equals
的唯一定义。没有可在实例之间进行比较的字段,因此实例只能等于其自身。
在评论中您说过:
我想了解字符串比较,我看到人们一直在使用它
您的问题询问的是Object
,而不是String
。 String
会覆盖equals
,因为Object
对equals
的定义不适用于String
。因此,String
定义了自己的名称(与equals
实现所需的语义保持一致)。
答案 1 :(得分:1)
对象没有可与之进行比较的值。
但是为了有意义,它必须为equals()或hashCode()之类的方法提供实现。
因此,准确地说:派生自Object的类应重写equals(),以防它们用“值语义”替换引用等式。