重写equal场景
原则上不重写equal方法;
但是当一个类
- 包含一个逻辑相等的概念时,
- 而这个逻辑相等又有别于对象标识(Object类的equal方法默认比较的是对象标识),
- 而且父类又没有重写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方,不要将参数类型改称具体类型