重写hashCode和equals

本文详细介绍了在Java中重写equals和hashCode方法的重要性及原则。当equals相等时,hashCode必须相等,但反之不成立。示例展示了如何根据类的属性选择合适的字段进行重写,以确保对象比较的一致性和哈希表的正确性。同时,文中强调了在重写这两个方法时,字段选择的一致性以避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值