一、equals的定义和作用
Java中,Object类是所有对象的祖先,每个类都继承了Object类。在Object类中有一个equals方法,它的定义如下所示:public boolean equals(Object obj) { return (this == obj); }可以看到,Object类中的equals方法只是识别它们是否指向同一内存位置的对象。这个方法在大多数情况下可能无法满足开发人员的需求,因为我们通常需要比较两个对象的内容是否相等而不是其引用是否相等。
因此,实现类往往需要进行重写equals方法以满足特定需求。
二、equals重写的考虑因素
在Java中,默认实现中,两个对象相等的定义是通过比较对象引用的相等性来决定的。然而,可能某些类需要比较对象中的数据成员而不是对象的引用,因此Java提供了equals方法来实现对象之间的相等比较。 在重写equals方法时,需要满足以下几个条件: 1. 自反性:x.equals(x)返回true。 2. 对称性:x.equals(y)和y.equals(x)必须返回相同的结果。 3. 传递性:如果x.equals(y)返回true,y.equals(z)也返回true,则x.equals(z)也应该返回true。 4. 一致性:如果x.equals(y)返回true,则在对象未更改的情况下多次调用该方法始终返回true,在对象更改的情况下多次调用该方法则始终返回false。 5. 非空性:x.equals(null)应该返回false。三、equals方法的常见实现方式
常见的equals方法的实现方式大致分为以下三类: 1. 使用instanceof运算符检查是否为正确类型public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; MyObject obj = (MyObject) o; return this.field.equals(obj.field); }2. 检查类的每个数据成员是否相等
public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof MyObject)) { return false; } MyObject o = (MyObject) obj; return Objects.equals(field1, o.field1) && Objects.equals(field2, o.field2) && Objects.equals(field3, o.field3); }3. 使用反射来检查对象的每个数据成员
public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj.getClass() == getClass())) { return false; } try { Field[] fields = getClass().getDeclaredFields(); for (Field field : fields) { if (!field.get(this).equals(field.get(obj))) { return false; } } } catch (IllegalAccessException e) { return false; } return true; }