我们应该总是超越平等吗?

Nic*_*ner 14 java comparison inheritance equals

在编写自己的类时,是否总是需要覆盖equals(Object o)

如果我不这样做,它会自动检查所有字段是否相同?或者只是检查两个变量是否指向同一个对象?

coo*_*ird 16

如果正在编写一个将以某种方式对其对象进行比较的类,那么应该覆盖equalshashCode方法.

不提供显式equals方法将导致equals从超类继承方法的行为,并且在超类是Object该类的情况下,那么它将是该类的Java API规范中设置的行为Object.

提供equals方法的一般合同可以在Object课程的文档中找到,特别是equalshashCode方法的文档.


War*_*ior 5

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

要测试两个对象在等价意义上是否相等(包含相同的信息),您必须覆盖 equals() 方法。如果标识运算符不适合您的类,则应始终覆盖 equals() 方法。

请注意,每当重写此方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。


cle*_*tus 5

只有equals()在有意义时才覆盖.但显然如果你覆盖equals()你需要确保hashcode()合同没有被破坏,这意味着如果两个对象相等,它们必须具有相同的哈希码.

什么时候有意义?什么时候Object.equals()不够.该方法基本上归结为引用标识,意味着两个对象是同一个对象,所以:

a.equals(b) iff q == b
Run Code Online (Sandbox Code Playgroud)

数字是有意义的一个明显的例子,因为它Integer(10)应该与另一个相等Intger(10).

另一个例子可能是您表示数据库记录时.比方说,你有一个唯一的整数ID学生档案,那么它可能是有充分的实施等于简单地比较ID字段.