hashCode和equals重写
重写hashCode和equals时需注意一点,equals相等则hashCode一定相等(相同对象hash值一致);hashCode相同equals不一定相等(hash值相同不能确定为同一个对象)。所以重写时要保证hashCode的字段和equals的字段相同,否则会导致相同对象有不同的hash值!
重写hashCode
Object中的hashCode为native方法,我们对类的hashCode重写本质上只是调用Object中的hashCode进行二次运算,不一定所有字段都要参与运算,选择主要且适当的字段即可。运算时需要一个系数,自定义一个系数即可。
@Data
public class Student {
private String name;
private Integer age;
private Integer sex;
@Override
public int hashCode(){
int coefficient = 37;
int result = name != null ? name.hashCode() : 0;
result = coefficient * result + (age != null ? age : 0);
result = coefficient * result + (sex != null ? sex : 0);
return result;
}
}
重写equals
和hashCode一样,不一定所有字段都要参与比较,选择主要且适当的字段即可。且如果同时重写了hashCode和equals,一定要确保参与hash运算和euqals比较的字段一致。需要对传入的对象进行类型比较和判空。
@Data
public class Student {
private String name;
private Integer age;
private Integer sex;
@Override
public boolean equals(Object o) {
if (this == o) return true; //对象引用相等则一定相同
if (!(o instanceof Student)) return false; //判断类型是否相等(包含了不为空的判断)
Student student = (Student) o;
return name.equals(student.name) && age.equals(student.age) && sex.equals(student.sex);
}
}