在编写自己的类时,是否总是需要覆盖 equals(Object o)
方法?
如果不这样做,它会自动检查所有字段是否相同吗?还是只检查两个变量是否指向同一个对象?
在编写自己的类时,是否总是需要覆盖 equals(Object o)
方法?
如果不这样做,它会自动检查所有字段是否相同吗?还是只检查两个变量是否指向同一个对象?
只有在合理的情况下才覆盖equals()
方法。但是,如果您覆盖了equals()
方法,则需要确保hashcode()
方法的合同没有被破坏,这意味着如果两个对象相等,则它们必须具有相同的哈希码。
什么时候是合理的?当Object.equals()
方法不足以满足需求时。该方法基本上归结为引用标识,这意味着两个对象是同一个对象,因此:
a.equals(b) iff q == b
当涉及到数字时,Integer(10)
应该等于另一个Intger(10)
,这是一个显而易见的例子。
另一个例子可能是当您表示数据库记录时。假设您有具有唯一整数ID的学生记录,那么只比较ID字段可能是足够的实现等号的方法。
Object类的equals方法实现了对象之间最具有区分性的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一个对象(x == y的值为true)时,该方法返回true。
要测试两个对象在等价性方面是否相等(包含相同信息),必须重写equals()方法。如果身份运算符不适用于您的类,则应始终重写equals()方法。
请注意,通常需要在重写此方法时重写hashCode方法,以便维护hashCode方法的一般契约,即相等的对象必须具有相等的哈希码。