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

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

我只能说只要你不碰到这几个主,你也没什么事的!

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

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

2、他们用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类库,直接在类上注解即可。

end:如果你觉得本文对你有帮助的话,记得点赞转发,你的支持就是我更新动力。

为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...相关推荐

  1. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  2. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  3. python字符串equals方法_判断字符串相等-Equals(上)

    本次课程是零基础课程,只要熟悉计算机的基本应用和操作,一般可以完成本次课程学习.本课程深入浅出的介绍了C#语言的基本语法结构.条件选择.循环.异常处理.数组.集合.值类型和应用类型.字符串的常用方法. ...

  4. 为什么使用HashMap需要重写hashcode和equals方法_《进大厂系列》系列-HashMap

    你知道的越多,你不知道的越多 点赞再看,养成习 正文 一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前. 看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧 ...

  5. hashcode相等的两个对象一定相等吗_为什么重写 equals方法时一定要重写hashCode方法?...

    推荐阅读: 一线架构师总结SpringBoot,Cloud,Nginx与Docker,不信你搞不懂 47天洒热血复习,我终于"挤进"了字节跳动(附面经+学习笔记) 五年时间,从蘑菇 ...

  6. java重写面试题_Java面试题:重写了equals方法,为什么还要重写hashCode方法?

    核心问题:重写了equals方法,为什么还要重写hashCode方法? 这不仅仅是一道面试题,而且是关系到我们的代码是否健壮和正确的问题.在前面两篇文章涉及到了equals方法的底层讲解:<说说 ...

  7. Java重写equals方法时为什么要重写hashCode方法

    在我们平时编写Java代码时,重写equals方法时一定要重写hashCode方法,这是为什么呢? 在讨论这个问题前,我们先看下Object类中hashCode方法和equals方法. hashCod ...

  8. 为什么要重写hashCode()方法和equals()方法以及如何进行重写

    一.前言 本篇文章主要探讨的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法? 2.在什么情况下需要重写hashCode()方法和equals()方法? 3.如何 ...

  9. 面试题:重写equals方法为什么通常会重写hashcode方法?

    最近在面试的时候,当问完了HashMap的数据结构之后,通常会再多问一个问题,就是:重写equals方法时通常为什么也要重写一下hashcode方法? 其实这个问题,本质上又回到HashMap的应用场 ...

最新文章

  1. Objective-C笔记
  2. NoSQL(二):创建、管理集群
  3. 安装VM及在VM下安装Ghost XP系统图文教程,附PQ分区及VM共享教程 z
  4. 创建一个dynamics 365 CRM online plugin (一) - Hello World Plugin
  5. [CODEVS1205]单词反转
  6. 尴尬又暖心!学生知乎上提问导师人品如何,没想到导师亲自回答了...
  7. 错误解决办法:gcc编译时提示对‘sqrt’未定义的引用
  8. 简单实现DButil工具类
  9. Firefox,火狐about:config设置详解
  10. Tensorflow(八) —— Tensor的合并与切割
  11. kubernetes使用flannel网络插件服务状态显示CrashLoopBackOff
  12. 虚拟机的Nginx安装配置
  13. 使用pygame开发一个小游戏
  14. 关于跨网闸数据同步的方式调研Java实现ModbusTCP通信
  15. 解决:sql server无法在C盘下创建database/操作系统错误5(拒绝访问)
  16. 【相机标准】我的cameralink协议学习笔记(个人中文翻译,以及理解)
  17. 做好网络推广工作需要做出哪些努力?
  18. 解决DNS服务器未响应网络异常
  19. openwrt安装Linux软件,OpenWrt安装软件的方法
  20. 选择公理可能不成立,否则计算机可以生成真正的随机数

热门文章

  1. 我的第一个安卓应用程序_今天,我启动了我的第一个移动应用程序。 这是我学到的...
  2. snapchat_机器中的幽灵:Snapchat不是移动优先的-完全是另一回事
  3. PyTorch入门-自然语言分类任务
  4. 618购物节要到了,Python帮你实现商品有货的微信提醒
  5. 手把手教你进行pip换源,让你的Python库下载嗖嗖的
  6. 探索 Python + HyperLPR 进行车牌识别
  7. 将下载都是大写字母的网页里面的html转换为小写的简单方式
  8. pytorch中获取指定位置元素
  9. 去哪儿-18-detail-list
  10. java中集合(List)的嵌套分配值、移除等操作