为什么重写 equals() 时必须重写 hashCode() 方法?

在Java中,当你重写equals(Object obj)方法时,通常也建议重写hashCode()方法,基于Java集合框架中哈希表(如HashMapHashSet等)的工作原理以及hashCode()equals()方法之间的一致性约定。

一致性约定:

Java文档明确指出,如果两个对象通过equals(Object obj)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的整数结果。这是hashCode()equals()方法之间的一致性约定。

集合框架的依赖:

Java集合框架中的许多类(如HashMapHashSet等)都依赖于hashCode()equals()方法来正确地管理元素。特别是,这些集合使用哈希码来快速定位元素在哈希表中的位置(即“桶”或“槽”)。

为什么需要同时重写:

  1. 正确性:如果不重写hashCode()方法,即使两个对象通过equals()方法比较是相等的,它们也可能有不同的哈希码。这会导致它们被放置在哈希表的不同位置,从而违反了一致性约定,并可能导致集合操作(如containsremove等)的行为不正确。

  2. 性能:即使两个对象不相等,但如果它们的哈希码相同(即发生了哈希冲突),它们也会被放置在同一个哈希桶中。此时,equals()方法将被用来进一步区分这些对象。如果equals()方法被正确重写但hashCode()方法没有,那么即使对象不相等,也可能因为哈希冲突而频繁地调用equals()方法,从而降低性能。

  3. 遵守约定:Java平台的设计者期望开发者在重写equals()方法时同时考虑hashCode()方法。这是Java集合框架能够正确工作的基础之一。

示例:

考虑一个Person类,其中只重写了equals()方法而没有重写hashCode()方法。如果两个Person对象具有相同的nameage(因此通过equals()方法比较是相等的),但由于没有重写hashCode()方法,它们可能具有不同的哈希码。当这些对象被用作HashSetHashMap的键时,就可能导致集合无法正确地识别它们为相等的对象,从而引发问题。

总结

  • equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。
  • 两个对象有相同的 hashCode 值,他们也不一定是相等的(哈希碰撞)。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值