Java 对象类的equals()方法

Java 对象类的equals()方法,java,oop,jls,Java,Oop,Jls,我在看书,根据它 The method equals defines a notion of object equality, which is based on value, not reference, comparison. 但是当我打开对象类的equals方法的声明时,它是: public boolean equals (Object o) { return this == o; } 但是在这里,引用是用引用相等运算符(=)检查的,这个声明如何与规范匹配?请参见: 类对象的

我在看书,根据它

The method equals defines a notion of object equality, which is based on value, 
not reference, comparison.
但是当我打开
对象
类的
equals
方法的声明时,它是:

public boolean equals (Object o) {
    return this == o;
}
但是在这里,引用是用
引用相等运算符(=)
检查的,这个声明如何与规范匹配?

请参见:

类对象的equals方法在对象上实现了最有区别的可能的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x==y的值为true)时,此方法才返回true

这意味着,如果你不在你的类中重写它,这就是你得到的

JLS的说法仍然正确;但是,由实现定义自己的
.equals()
契约

(当然,如果您重写
.equals()
,您也应该重写)

请参见:

类对象的equals方法在对象上实现了最有区别的可能的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x==y的值为true)时,此方法才返回true

这意味着,如果你不在你的类中重写它,这就是你得到的

JLS的说法仍然正确;但是,由实现定义自己的
.equals()
契约


(当然,如果重写
.equals()
,也应该重写)

对象中的值是什么?它没有要比较的属性,因此对象本身就是值。对象中的值是什么?它没有要比较的属性,因此对象本身就是值。请详细说明如果我重写
.equals()
@Vishrant,为什么我需要重写
.hashCode()
,因为如果a.equals(b)则必须是a.hashCode()==b.hashCode(),否则使用集合时会有很多问题,例如,同样根据
javadoc
它是
当且仅当x和y引用同一个对象(x==y的值为true)时,此方法返回true。
但当我阅读JLS时,它是基于
值而非引用编写的比较,比较。
@Vishrant如果您使用
HashSet
并忘记覆盖
.hashCode()
,两个
.equals()
的值可能会在集合中重复,这将违反
集合的约定(因为
HashSet
通过
.equals()
定义等价性)@维什兰特经验法则:总是覆盖两者;这将避免给您和您的用户带来令人不快的惊喜(也许您永远不会在
Hash*
s中使用您的对象,但您不能保证您的用户会这样做),请详细说明为什么如果我重写
.equals()
,那么我需要重写
.hashCode()
@Vishrant,因为如果a.equals(b)那么a.hashCode()==b.hashCode()是强制的或者你在使用集合时会遇到很多问题,例如,根据
javadoc
它是
当且仅当x和y引用同一个对象(x==y的值为true)时,此方法返回true。
但是当我读JLS时,它是基于
值编写的比较,而不是引用,比较。
@Vishrant如果您使用
HashSet
并忘记覆盖
.hashCode()
,两个
.equals()
的值可能会在集合中重复,这将违反
集合的约定(因为
HashSet
通过
.equals()
定义等价性)@维什兰特经验法则:总是覆盖两者;这将避免给您和您的用户带来令人不快的惊喜(也许您永远不会在
Hash*
s中使用您的对象,但您不能保证您的用户会这样做)