重写equal 的同时为什么必须重写hashcode?

博客探讨了在Java中重写equals和hashCode方法的原因。当重写equals以满足特定比较逻辑时,也需要重写hashCode以确保对象在哈希集合中的正确行为。如果不这样做,可能会导致哈希表的性能问题。当equals相等时,hashCode必须相等,以满足哈希集合的查找规则,而hashCode相等但equals不相等的情况是允许的,这称为哈希碰撞。
摘要由CSDN通过智能技术生成

默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。

java集合中,判断两个对象是否相等的规则是:
判断两个对象的hashCode是否相等:

  • 如果不相等,认为两个对象也不相等;
  • 如果相等:判断两个对象用equals运算是否相等
    • 如果不相等,认为两个对象也不相等
    • 如果相等,认为两个对象相等

即:

  1. 如果两个对象相同(eqauls比较),那么它们的hashCode值一定要相同;key1=key2 则hash(key1)=hash(key2)
  2. 如果两个对象的hashCode相同,它们并不一定相同 ;hash(张三)=hash(李四) 但是(hash碰撞) :张三 !=李四

为什么要重载equal()

答案:因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存地址则相等,否则不相等;所有的对象都拥有标识(内存地址)和状态(数据)现需要利用对象里面的值来判断是否相等,则重载equal方法。

原文链接,很详细:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值