我正在阅读Java中的equals方法,我听到有人说==
测试参考相等性(它们是否是同一个对象)。 .equals()
测试价值平等(它们在逻辑上是否“相等”)。
我相信这是真的,但是,如果你看看.equals()
的源代码,它只是推迟到==
从Object类:
public boolean equals(Object obj) {
return (this == obj);
}
现在我很困惑。我看到的是我们正在测试当前对象是否具有与显式参数相同的引用。它是测试引用相等还是值相等?
来自the Javadoc:
类
Object
的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非null
参考值x
和y
,此方法返回true
当且仅当x
和y
引用相同的对象(x == y
具有值true
)。
Object
是最终的基类,这是它可以提供的equals
的唯一定义。没有字段可以跨实例进行比较,因此实例只能等于自身。
你在评论中说过:
我想知道字符串比较我看到人们一直使用它
你的问题是关于Object
,而不是String
。 String
凌驾于equals
,因为Object
对equals
的定义不适合String
。因此,String
定义了它自己的(与equals
实现所需的语义一致)。
对象没有值来比较任何东西。
但是为了理解,它必须为equals()或hashCode()等方法提供实现。
因此,确切地说:派生自Object的类应该重写equals(),以防它们用“值语义”替换引用相等性。