为什么重写equals还要重写hashcode

当类A的三个对象在HashMap中作为key时,仅重写equals会导致map.size()为3,因默认hashcode比较内存地址。为确保相同成员的对象被视为同一key,需要重写hashcode,使其基于对象成员计算,确保相等对象有相同的hashcode。
摘要由CSDN通过智能技术生成

如果一个类A我们通过它生成三个对象

A a1=new A(3,4);
A a2=new A(1,2);
A a3=new A(1,2);

如果我们要比较这三个对象是否相等,肯定得重写equals方法,然后依次比较里面的成员是否相等。只重写equals方法的话我们会得到

a1.equals(a2); //为false
a2.equals(a3); //为true

这里都没有问题,但是当我们用HashMap以A对象为key存放值时

HashMap<A,Integer> map=new HashMap<>();
map.put(a1,111);
map.put(a2,222);
map.put(a3,333);

理论上我们得到的map应该只有两个值,因为a2和a3两个key是一样的,后面添加的333会改变前面的222。所以map.size()为2,map.get(a2)=333,map.get(a3)=333;然而A类在没有重写hashcode方法的情况下并不是这样的结果,map.size()=3,map.get(a2)=222,map.get(a3)=333。说明在HashMap里a2和a3还是不一样的对象,因为在HashMap里比较key是否相等要同时比较equals和hashcode两个方法,而A类默认的hashcode方法是继承自Object类的,它比较的是默认的内存地址,显然a2和a3是两个对象,内存地址肯定是不一样的,所以要重写hashcode不要比较对象的内存地址而是对象的hashcode值,hashcode值的计算一般是通过A对象里的成员的值计算得到的,只要a2,a3成员相同,其hashcode值就相同。
所以重写hashcode是为了在用HashMap以对象为key时,两个有相同成员的对象能当作同一个key处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值