什么时候重写equal方法

重写equal场景

原则上不重写equal方法;

但是当一个类

  1. 包含一个逻辑相等的概念时,
  2. 而这个逻辑相等又有别于对象标识(Object类的equal方法默认比较的是对象标识),
  3. 而且父类又没有重写equal方法的时候;如:Integer、String等

重写equal有哪些约定

  • 自反性:非空实例x,x.equal(x) = true
  • 对称性:非空实例x,y;x.equal(y) = true, 那么 y.equal(x) = true
  • 传递性:非空实例x,y,z;x.equal(y) = true, y.equal(z) = true,那么 x.equal(z) = true
  • 一致性:非空实例 x,y,没有更改信息下;多次调用 x.equal(y) 返回结果是不变的
  • null比较返回false:非空实例下;x.equal(null) = false

重写equal错误示例

//错误方式;因为参数类型不是Object类型,那么就不是重写 Object 类中的 方法;只不过是重载而已
public boolean equal(Integer i){
  ...
}

//正确写法
@Override
public boolean equal(Object object) {
  if (object == this) {
    return true;
  }
  if (!(object instanceof MyType)) {
    return false;
  }
  if (object.hashCode() != this.hashCode()) {
    return false;
  }
  //值比较...
}

重写equal注意点

  • 重写equal方法时,重写hashCode方法
  • 重写equal方法,需要满足自反性、对称性、传递性、一致性、null比较返回false
  • 重写equal方,不要将参数类型改称具体类型

你可能感兴趣的:(什么时候重写equal方法)