我们应该总是重写equals吗?

问题描述:

在编写自己的课程时,是否需要覆盖equals(Object o)我们应该总是重写equals吗?

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

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

不提供显式equals方法将导致继承从超类的equals方法的行为,以及在超类是所述Object类的情况下,那么这将是该行为在用于在Java API规范setforth Object类。

用于提供equals方法一般合同可以在文档中找到的Object类,具体而言,的equalshashCode方法的文档。

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

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

请注意,无论何时重写此方法,通常都需要重写hashCode方法,以便维护hashCode方法的一般约定,该方法声明相等对象必须具有相同的哈希代码。

如果有意义,只能覆盖equals()。但很明显,如果您覆盖equals(),则需要确保hashcode()合同没有中断,这意味着如果两个对象相同,它们必须具有相同的散列码。

它什么时候有意义?当Object.equals()不足时。该方法基本上可以归结为参考身份,这意味着两个对象是相同的对象,以便:

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

另一个示例可能是您代表数据库记录时。假设您的学生记录具有唯一的整数ID,那么可能是就足够执行等于只是比较ID字段。

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