Java 对象中的equals实现

Java 对象中的equals实现,java,equals,equality,Java,Equals,Equality,我在读Java中的equals方法,我听到有人说==测试引用的相等性(它们是否是相同的对象).equals()测试值是否相等(它们在逻辑上是否“相等”) 我相信这是真的,但是如果你看一下.equals()的源代码,它只是遵从= 从对象类: public boolean equals(Object obj) { return (this == obj); } 现在我很困惑。我看到的是,我们正在测试当前对象是否对显式参数具有相同的引用。它测试的是引用相等还是值相等 来自: clas

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

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

从对象类:

    public boolean equals(Object obj) {
    return (this == obj);
}
现在我很困惑。我看到的是,我们正在测试当前对象是否对显式参数具有相同的引用。它测试的是引用相等还是值相等

来自:

class
Object
的equals方法在对象上实现了最具辨别力的等价关系;也就是说,对于任何非
null
参考值
x
y
,当且仅当
x
y
引用同一对象(
x==y
具有值
true
)时,此方法返回
true

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


你在评论中说:

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


您的问题询问的是
对象
,而不是
字符串
<代码>字符串覆盖
等于
,因为
对象
等于的定义不适用于
字符串
。因此,
String
定义了自己的字符串(与
equals
实现所需的语义保持一致)。

对象没有任何可比较的值

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


所以,准确地说:从Object派生的类应该重写equals(),以防它们用“值语义”替换引用等式

equals
意味着在
对象的子类中被重写
读过吗?似乎很清楚为什么
Object#equals
使用
=
…是的,我知道,但我想知道关于字符串比较,我看到人们一直在使用它。公平地说,文档中没有明确说明是否需要重写该方法,虽然一个简单的谷歌搜索就可以解决OP的困境。@Mena-在文档中记下这一点不会有什么坏处,但当然,你不必重写它。它与其他方法一样:如果超类的版本适用于您的类,则可以不使用它。对于许多类,
对象的定义很好。:-)完全同意,您不必覆盖它-您可能需要。只有文档没有说明重写是实现基于非引用的相等性检查的理想方式(这同样很容易自己解决)。所以是的,“不会受伤”,但很好。