Java基础:讲一下equals()与hashcode(),什么时候重写,为什么重写,怎么重写?

首先 equals( ) 是 Object 中的方法,默认是用 = = 来比较的。hashCode( ) 也是 Object 类的方法,根据一定的规则将与对象相关的信息,比如对象的内存地址,映射成一个数值,这个数值称作为哈希值。

有时候我们想要自定义类的比较规则时,需要重写 equals( ),但是为了保证类在 HashSet 和 HashMap 等集合中的正确存储,也要同时重写 hashCode( ) 。

以 HashMap 为例, HashMap底层在添加相同的元素时,会先调用两个对象的 hashCode( ) 是否相同,如果相同还会再用 equals( ) 比较两个对象是否相同。

假设有一个 Person 类,有 name 和 age 两个字段,我们现在重写 equals( ) 规定只有两个 Person 的 name 和 age 都相同时,才认为两个 Person 相等。现在 new 出两个 name 和 age 都相同的 Person,分别添加到 HashMap 中。

我们期望最后 HashMap 中只有一个 Person,但其实是有两个。原因在于添加第二个 Person 时,先比较的是两个 Person 的 hashCode( ),注意此时我们没有重写 hashCode( ) ,那么分别 new 出来的 Person 的哈希值肯定是不同的,到这里 HashMap 就会将两个 Person 认定为不同的元素添加进去。

解决的办法就是重写 hashCode( ),最简单的返回 name 和 age 的哈希值的乘积即可。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值