hashCode和Equalsed之间的关系?

在Java中,hashCode方法用于获取对象的哈希码,用于快速定位对象。如果两个对象的hashCode相同,它们可能是同一个对象,需要通过equals进一步确认。当重写equals时,必须同时重写hashCode以保持一致性。HashMap在查找对象时,首先比较hashCode,相同才进行equals比较。未重写hashCode可能导致HashMap无法正确识别相等的对象。
摘要由CSDN通过智能技术生成

hashCode和Equalsed之间的关系

在Java中,每个对象都可以调用自己的hashcode方法得到自己的hhashcode值,相当于对象的指纹信息,通常来说世界上没有完全相同的两个指纹,但是在Java中做不到这么绝对,但是我们可以用hashcode来做一些提前的判断,比如:

如果两个对象的hashcode不相同,那么这两个对象肯定是不同的两个对象。

如果两个对象的hashcode相同,那么这两个对象可能是一个对象,也可能是两个对象。

如果两个对象相等,那么他们的hashcode一定相同。

在Java的实现类中,比较两个对象是否相等时,会根据上面的原则,会先调用对象的hashcode方法得到hashcode进行比较,如果hashcode不同,可以认定两个对象不相同,如果hashcode相同,会进一步调用equals方法,用来确定最终对象是不是相同的,通常equals方法实现会比较重,逻辑比较复杂,而hashcode就是得到一个hashcode,实际上就是一个数字,相对而言较轻,所以在比较两个对象时,通常会根据hashcode比较一下。

如果重写了equals方法,一定要遵守以上规则。

代码测试:

hashmap.get()底层会先比较两个对象的hash值是否相等,然后才去比较其他内容;

 

(1)实体类(重写equals和hashcode方法)

public class shiTi {
    private  String name;

    public shiTi(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        shiTi shiTi = (shiTi) o;
        return Objects.equals(name, shiTi.name);
    }

//    @Override
//    public int hashCode() {
//        return name.hashCode();
//    }
}

(2)测试类

public class test {
    public static void main(String[] args) {
        Map<shiTi,Integer> map = new HashMap<>();
        shiTi shiTi = new shiTi("test");
        map.put(shiTi,123);
        System.out.println(map.get(new shiTi("test")));
    }

}

运行结果:

未重写hashcode方法:(这里调用底层hashcode得到hash值,对比两个对象不相等,所以get为空)

重写hashcode方法:(这里调用重写的hashcode方法,根据name得到hash值,name属性相同认为两个对象相同,故可以得到value值)

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗着,享受着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值