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

时间:2009-10-11 01:14:21

标签: java inheritance comparison equals

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

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

4 个答案:

答案 0 :(得分:16)

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

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

提供equals方法的一般合同可以在Object类的文档中找到,具体来说,可以在equalshashCode方法的文档中找到。 / p>

答案 1 :(得分:5)

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

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

a.equals(b) iff q == b

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

另一个例子可能是您表示数据库记录时。假设您有具有唯一整数ID的学生记录,那么可能足以实现等于简单地比较ID字段。

答案 2 :(得分:4)

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

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

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。

答案 3 :(得分:2)

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