趣味Java(面试必备小知识):不同时重写equals和hashCode又会怎样?

不同时重写equals和hashCode又会怎样?


前言

今天博主将为大家分享:趣味Java(面试必备小知识):不同时重写equals和hashCode又会怎样?,不喜勿喷,如有异议欢迎讨论!


开始先吐槽

一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了(反正我是记不住),此时我不得不佩服,这么多约定竟然都能记得,但我不知道你是不是真的理解呢。


我不同时重写又能如何呢?

在这里插入图片描述
我只能说只要你不碰到这几个主,你也没什么事的!

为什么不能遇到它们几个呢?

因为它们几个会用到hashCode方法。

他们用hashCode方法来干嘛?

hashCode方法是根据对象的地址生成的一个int整数,默认它和地址一一对应的,如果不重写,那么只有对象地址一样的情况下,哈希值才相等。

equals默认用来比较地址是否相同,但当集合中元素增多时,再使用equals判断,效率是比较低的;而哈希值是可以快速定位到指定的元素的,所以默认Java就使用哈希值来比较定位,因此有了Object.hashCode的约定。

Set怎么实现存储不重复的元素的?HashMap怎么判断相同的key的?有兴趣可去深入了解一下。


例子

小王在「堆」中有两套房产,这两套房产位于不同的地址。现在我想要判断这两套房子是否是同一个主人?

在这里插入图片描述

于是我去问Object,而Object告诉我这两套房产不是一个人的!

我:为什么呢?

Object: equals告诉我两套房子离了十万八千里,在不同的地方(地址),当然不是同一个人了。

我:这逻辑……(不符合我们常规的认知啊)

既然这样,那我只能重写equals了!

在这里插入图片描述

哈哈,好啦,现在equals终于知道这两个房子是同一人的啦!

然而在房产管理局(HashMap)我得到一个消息:小王只要一套房产!

WTF!我白干了!

房产管理局(HashMap): 不信你看!

在这里插入图片描述
遇到你真是倒霉了,原来房产管理局(HashMap)使用了hashCode来计算的!想要正确的统计小王的房产只能重写hashCode方法了。

在这里插入图片描述


总结

除非你能保证你重写equals的类不被Set,Map使用,否则你就必须同时重写equals和hashCode。

你能保证吗?如果不想同时重写,你可以这样:

在这里插入图片描述

信不信这样写,老大看到后,就say goodbye了!


如何重写equals与hashCode

我就不写出常说的那些约定性质了,写了也记不住。说说如何避免违反这些约定:

1、重写equals

通过==判断是否是同一个引用

通过instanceof判断是否是相同类型

把参数转为正确的类型

对比双方各个属性值是否相同

在这里插入图片描述

2、重写hashCode

  • hashCode方法应该为“不相等的对象产生不相等的哈希值”

  • 一般计算是根据你equals中用来比较的属性的hashCode组合计算的,不过目前JDK和一些类库已经给我提供了很好的重写方式,我们可不必去深究其中算法。

方式一:
在这里插入图片描述

使用了JDK自带Objects提供的静态方法。

方式二:
在这里插入图片描述

使用了lombok类库,直接在类上注解即可。


到这里:趣味Java(面试必备小知识):不同时重写equals和hashCode又会怎样?,分享完毕了,快去试试吧!


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈永佳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值