参照java核心卷1
java规范中equals方法特征
- 自反性
对于任何非空引用x, x.equals(x) 返回true;
- 对称性
对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true;
- 传递性
对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true;
- 一致性
若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果.
- 对任意非空引用x, x.equals(null) 返回false;
编写equals方法的建议:
- 显示参数命名为otherObject, 稍后转化成other变量
public boolean equals(Object otherObject)
- 检测this和otherObject是否是同一个对象的引用,是,返回true;
if( this==otherObject){
return true;
} - 检测otherObject是否为null, 是, 返回false;
if(otherObject == null){
return false;
} - 比较this和otherObject是否属于同一个类. 如果equals的语义在每个子类中有所改变,就使用getClass检测:
if(getClass() != otherObject.getClass()){
return false;
}if(!(otherObject instanceof Employee)){
return false;
} - 将otherObject转化为相对应的类型变量other
Employee other = (Employee)otherObject;
- 对所需要的比较的数据域进行比较. 如果是基本数据类型,使用a==b比较; 如果是对象比较,调用Objects.equals(a, b)进行比较
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
private String name;
private double salary;
private Date hireDay;
...
@Override
public boolean equals(Object obj) {
// 如果为同一对象的不同引用,则相同
if (this == obj) {
return true;
}
// 如果传入的对象为空,则返回false
if (obj == null) {
return false;
}
// 如果两者属于不同的类型,不能相等
if (getClass() != obj.getClass()) {
return false;
}
// 类型相同, 比较内容是否相同
Employee other = (Employee) obj;
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
}
}