提问人:Hamza Belmellouki 提问时间:9/25/2018 更新时间:9/25/2018 访问量:2393
Object 中的 equals 实现
The equals implementation in Object
问:
我正在阅读 Java 中的 equals 方法,我听到有人说测试引用相等性(它们是否是同一个对象)。 测试价值相等(它们在逻辑上是否“相等”)。==
.equals()
我相信这是真的,但是,如果你看一下 的源代码,它只是服从.equals()
==
在 Object 类中:
public boolean equals(Object obj) {
return (this == obj);
}
现在我很困惑。我看到的是我们正在测试当前对象是否具有对显式参数的相同引用。它是否测试参考相等或价值相等?
答:
8赞
T.J. Crowder
9/25/2018
#1
在 Javadoc 中:
类的 equals 方法在对象上实现了最具区分性的等价关系;也就是说,对于任何非引用值 和 ,此方法返回当且仅当 和 引用相同的对象(具有值)。
Object
null
x
y
true
x
y
x == y
true
Object
作为最终的基类,这是它唯一可以提供的定义。没有要跨实例比较的字段,因此实例只能等于自身。equals
在评论中,你说:
我想知道字符串比较,我看到人们一直在使用它
您的问题询问的是 ,而不是 。 覆盖 ,因为 的定义不适合 。因此,定义自己的(与实现所需的语义保持一致)。Object
String
String
equals
Object
equals
String
String
equals
评论
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(),以防它们用“值语义”替换引用相等。
下一个:空列表相等性如何工作?
评论
equals
旨在在Object
Object#equals
==