一、为什么要重写equals方法?
Object类是Java中所有类的基类,Object类中的equals方法实际比较的是两个对象的内存地址是否相等。如果两个引用指向同一个对象,则equals返回true,否则返回false
Object类中equals方法定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
实际应用中,往往需要比较两个对象实际状态,所以需要重写equals方法
二、重写equals方法的相关约定
1)自反性:对于任何非空引用值x,x.equals(x)都应返回true
2)对称性:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true
3)传递性:对于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么 x.equals(z) 应返回true
4)一致性:对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改
5)非空性:对于任何非空引用值x,x.equals(null)都应返回false
三、重写equals方法案例
public class People {
private Integer id;
private String name;
@Override
public boolean equals(Object obj) {
// 如果为同一对象的不同引用,则返回true
if (this == obj) {
return true;
}
// 如果传入的对象为空,则返回false
if (obj == null) {
return false;
}
// 如果两者属于不同的类型,则返回false
// if (getClass() != obj.getClass()) {
// return false;
// }
if (!(obj instanceof People)) {
return false;
}
People people = (People) obj;
return Objects.equals(id, people.getId()) && Objects.equals(name, people.getName());
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
四、hashCode的通用约定
重写equals方法时总要重写hashCode
1)只要对象equals方法涉及到的关键域内容不改变,那么这个对象的hashCode总是返回相同的整数
2)如果两个对象的equals(Object obj)方法时相等的,那么调用这两个对象中的任意一个对象的hashCode方法必须产生相同的整数结果。如果两个对象equals方法不同,那么必定返回不同的hashCode整数结果