作者:flyhero

微信公众号:码上实战(ID:Push-Code)

可能一问到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类库,直接在类上注解即可。

另外,大家可以参考一篇文章:《看似简单的hashCode和equals面试题,竟然有这么多坑!》

不同时重写equals和hashCode又会怎样?相关推荐

  1. hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?

    前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...

  2. Java:重写equals()和hashCode()

    http://blog.csdn.net/ansel13/article/details/5437486 很基础的东西就是由于没上心,三番五次地出错,这次好好总结下吧. 众所周之,String .Ma ...

  3. 在Java里重写equals和hashCode要注意什么问题

    问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...

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

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

  5. 运用简单的超市购物车系统,理解重写equals、hashcode的意义

    更多干货见博主个人网站:https://blog.zhenglin.work 运用简单的超市购物车系统,理解重写equals.hashcode的意义,以及map的学习 商品类: 先编写一个商品类,要有 ...

  6. Java重写equals()和hashCode()

    1.何时需要重写equals() 当一个类有自己特有的 "逻辑相等"概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查 " ...

  7. Java重写equals和hashCode方法

    在日常程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容).假如我们创建了两个 ...

  8. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  9. 为什么重写equals()和hashcode()

    首先写个例子 public class TestTest{String name ;TestTest(String name){this.name = name;} public static voi ...

最新文章

  1. 女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖
  2. 基于多种服务的地理位置查询系统
  3. zsh 自动补全导致命令显示重复
  4. 《Effective Java 2nd》第4章 类和接口
  5. SQLAlchemy 使用经验
  6. python中的while语句怎么居中_python基础之while语句操作
  7. J2EE WEBWORK FRAMEWORK安全隐患
  8. 如何设置通知栏下拉不可用
  9. spring-mvc文件上传与下载
  10. 路由器的地址转换功能
  11. JAVA GUI设计
  12. c++ iostream
  13. 用户画像数据建模方法
  14. X79寨板远程启动计算机,X79旗舰主板评测
  15. selenium之 富文本框和editor编辑器的处理
  16. 电驴维持友情链接地址、更新服务器列表
  17. Svn中的tag标签的用法和意义
  18. Matlab:数据分析与多项式计算
  19. vue表格闪动 xn-table
  20. 74LS161计数器(多位数码管显示)

热门文章

  1. python ftp 上传
  2. php中的foreach和js中的foreach的用法和区别
  3. 《windows server 2008》FTP服务器搭建
  4. 为安装有系统及应用的服务器更换硬盘方法一例
  5. 使用U盘安装win7系统,遇到“无法定位现有系统分区”问题
  6. JS Math对象中一些小技巧
  7. DataTable的AcceptChange方法为什么不能在Update之前?
  8. wamp配置多少站点
  9. C# IntPtr 与 string互转
  10. 基于FFmpeg音视频流同步