博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重写equals方法时重写hashcode方法的必要性
阅读量:6905 次
发布时间:2019-06-27

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

hot3.png

首先明确一点,我们现在用的equals方法都是string重写过的,而并非原生的object类下的。

 

那如果重写了equals方法,而没有重写hashcode方法会出现什么情况呢?

如果重写了equals方法,那么可以确保两个比较对象的属性是相同的,那么此时如果未重写hashcode方法,由于hashcode比较是内存地址是否相同,那么此时不重写hashcode方法的话,会使用原生的object类下的hashcode方法,那两个比较对象的内存地址肯定是不同的,这显然是不符合规则。

 

所以重写equals方法的时候,必须保证重写hashcode方法

1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同!!!!;

2. 如果两个对象不同(即用equals比较返回true),那么它们的hashCode值可能相同也可能不同;(重写equals方法,未重写hashcode情况下)

3. 如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比较可能是false也可能是true)

4. 如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)

 

 

想一下若是重写了equals方法,但未重写hashcode方法的话,在实际应用中带来的严重后果

以hashset举例,我们都知道hashset存储的是无序不重复的对象,那他是如何实现的?

首先通过equals方法判断两个对象是否相等,然后根据调用两个对象的hashcode方法得到他们的hashcode值。如果此时只重写了equals方法,而未对hashcode方法重写,那么结果就是比较后发现两者的内存地址不同,认为这是两个不同的对象,然后存储的时候就会都存储进来,并且存储在不同的位置。这就不符合了hashset的原则了。出现了两个相同的对象

转载于:https://my.oschina.net/u/3869202/blog/3033179

你可能感兴趣的文章
杂七杂八的一起来
查看>>
C语言OJ项目参考(1942)进制转换
查看>>
Go 语言读写 Excel
查看>>
[LeetCode]--34. Search for a Range
查看>>
Single
查看>>
[LeetCode]--62. Unique Paths
查看>>
Java编程思想学习笔记——初始化与清理
查看>>
在PostgreSQL中如何生成线性相关的测试数据
查看>>
Go小tip
查看>>
Android开发者指南(5) —— monkeyrunner
查看>>
Linux下MySQL源码编译安装(eg:mysql-5.6.27.tar.gz )
查看>>
【转载】MySQL 大小写区分问题
查看>>
IPython基础使用_Round2
查看>>
图像处理------透明混合 - Alpha Blending效果
查看>>
阿里云MongoDB与EMR的HelloWorld
查看>>
cocos2d-x设计模式发掘之一:单例模式
查看>>
用cwRsync4.05版本作的WINDOWS服务器之间同步方案概要
查看>>
说说分布式事务
查看>>
NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作
查看>>
Android学习笔记(三)基础知识(2)
查看>>