16

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

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

4

4 回答 4

16

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

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

提供equals方法的通用合同可以在Object类的文档中找到,特别是equalshashCode方法的文档。

于 2009-10-11T01:16:46.790 回答
6

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

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

a.equals(b) iff q == b

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

另一个示例可能是当您表示数据库记录时。假设您有具有唯一整数 ID 的学生记录,那么简单地比较 ID 字段可能就足够了。

于 2009-10-11T01:36:09.217 回答
5

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

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

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

于 2009-10-11T01:18:46.053 回答
2

虽然您不应该依赖 IDE,但 Eclipse 通过按 alt + shift + s 并选择 equals 和 hashCode 菜单选项来提供这种预设功能。还有一个 toString 选项。 Josh Bloch 撰写的Effective Java对此主题有很好的信息。该链接会将您带到 Google 图书上讨论此主题的章节。

于 2009-10-12T04:52:58.930 回答