我们是否应该总是覆盖重写equals方法?

16

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

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

4个回答

16
如果一个类的对象需要以某种方式进行比较,那么应该重写 equalshashCode 方法。不提供明确的 equals 方法将继承超类中的 equals 方法,在超类为 Object 类的情况下,其行为将遵循 Java API 规范中 Object 类的规定。
有关提供 equals 方法的一般契约条款可以在 Object 类文档中找到,具体来说,是 equalshashCode 方法的文档。

6

只有在合理的情况下才覆盖equals()方法。但是,如果您覆盖了equals()方法,则需要确保hashcode()方法的合同没有被破坏,这意味着如果两个对象相等,则它们必须具有相同的哈希码。

什么时候是合理的?当Object.equals()方法不足以满足需求时。该方法基本上归结为引用标识,这意味着两个对象是同一个对象,因此:

a.equals(b) iff q == b

当涉及到数字时,Integer(10)应该等于另一个Intger(10),这是一个显而易见的例子。

另一个例子可能是当您表示数据库记录时。假设您有具有唯一整数ID的学生记录,那么只比较ID字段可能是足够的实现等号的方法。


5

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

要测试两个对象在等价性方面是否相等(包含相同信息),必须重写equals()方法。如果身份运算符不适用于您的类,则应始终重写equals()方法。

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


2
虽然你不应该依赖IDE,但是Eclipse通过按下alt + shift + s并选择等于和hashCode菜单选项提供了这个预设功能。还有一个toString选项。Josh Bloch的Effective Java在这个主题上有很好的信息。链接将带您到谷歌图书托管的章节,讨论此主题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接