关于Java重写equals()方法的步骤

Java语言规范要求equals方法具有下面的特性:

  1. 自反性:对于任何非空引用x,x.equals(x)应该返回true
  2. 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true
  3. 传递性:对于任何引用x和y和z,如果x.equal(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true
  4. 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果
  5. 对于任意非空引用x,x.equals(null)应该返回false

重写equals()方法的步骤:

  • 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量
  • 检测this与otherObject是否引用同一个对象
if (this == otherObject) 
    return true;
  • 检测otherObject是否为null,是则返回false
if (this == null) 
    return false;
  • 比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测
if (getClass() != otherObject.getClass()) 
    return false;
  • 如果所有的子类都拥有统一的语义,就使用instanceof检测
if (!(otherObject instanceof ClassName)) 
    return false;
  • 将otherObject转换成相应的类类型变量
ClassName other = (ClassName) otherObject
  • 将other需要比较的域成员都进行比较,只要有一个不同都返回false

需要注意的是,如果重新定义了equals()方法,就必须重新定义hashCode()方法,以便用户可以将对象插入到散列表中。equals()方法与hashCode()方法的定义必须保持一致,即如果equals()返回true,则2个对象的hashCode()必须具有相同的值。重写equals()方法中有提到,我们需要将要比较的域成员都进行比较,那么我们在重写hashCode()方法时可以将这些域成员的散列值组合起来,这样就能保证它与equals()方法具有一致性了。假设需被比较的域成员为field_1、field_2与field_3,那么我们可以编写一下hashCode()方法:

public int hashCode() {
    return Objects.hash(field_1, field_2, field_3);
}

 

你可能感兴趣的:(Java,equals()方法重写,hashCode()方法重写)