我们应该总是重写equals吗?
在编写自己的课程时,是否需要覆盖equals(Object o)
?我们应该总是重写equals吗?
如果我不这样做,它会自动检查所有的字段是否相同?或者它只是检查两个变量是否指向同一个对象?
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图书上的章节。