我们应该总是覆盖相等的吗?

2022-09-03 05:19:25

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

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


答案 1

如果一个人正在编写一个类,该类将以某种方式比较其对象,那么应该重写equalshashCode方法。

不提供显式方法将导致从超类继承方法的行为,并且在超类是类的情况下,它将是 Object 类的 Java API 规范中的行为集。equalsequalsObject

提供方法的一般协定可以在 Object 类的文档中找到,具体来说,就是 equalshashCode 方法的文档。equals


答案 2

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

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

a.equals(b) iff q == b

数字是一个明显的例子,当它有意义时,因为它应该等于另一个。Integer(10)Intger(10)

另一个示例可能是当您表示数据库记录时。假设您有具有唯一整数 ID 的学生记录,那么只需比较 ID 字段即可实现 equals。


推荐