博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
equals和hashcode详解
阅读量:7119 次
发布时间:2019-06-28

本文共 1376 字,大约阅读时间需要 4 分钟。

hot3.png

1、equals和hashcode的关系

equals()相等的两个对象,hashcode()一定相等;

equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。

换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。

反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等

2、为什么重写equals

如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址(重写之前),重写之后目的是为了比较两个对象的value值是否相等。
特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,
默认比较的是值,在比较其它自定义对象时都是比较的引用地址

3.什么是hashcode?

hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 

hashcode主要用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,
都是根据存储对象的hashcode值来进行判断是否相同的。
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,
那没就不必在进行equals的比较了
,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,

4、为什么重写equals方法,一定要重写HashCode方法?

如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

 5.使用HashMap时hashcode()和equals()为什么重写?

     
      HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的,例如,生成了两个“羊”对象,正常理解这两个对象应该是相等的,但如果你不重写 hashcode()方法的话,比较是不相等的!
     (HashMap中的key值比较方法 HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素是否相等。

使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

转载于:https://my.oschina.net/zjllovecode/blog/849370

你可能感兴趣的文章
不再联系
查看>>
VC++中遇到的各种数据类型BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR...
查看>>
background-size background-positon合并的写法
查看>>
linux创建进程和等待进程退出
查看>>
焦虑、不安
查看>>
【Go】string 优化误区及建议
查看>>
酷狗音乐快速转换MP3格式的方法
查看>>
原生JS 实现复杂对象深拷贝(对象值包含函数)
查看>>
解决vue报错Failed to mount component
查看>>
活学活用! 用Local Storage实现多人聊天室
查看>>
炫酷粒子表白,双十一脱单靠它了!
查看>>
Javascript--常用方法
查看>>
[译]迁移到新的 React Context Api
查看>>
线程池你真不来了解一下吗?
查看>>
【跃迁之路】【424天】程序员高效学习方法论探索系列(实验阶段181-2018.04.05)...
查看>>
解决“有边框的子元素宽度设定绝对值后,缩放浏览器会错位”的两种方法
查看>>
angular 基于ng-messages的验证
查看>>
三、取get
查看>>
利用PHP实现常用的数据结构之写在前面(小白系列文章一)
查看>>
使用asprise进行图片验证码识别
查看>>