重写hashcode方法需要重写equals方法吗?为什么?
这个问题其实是一个非常值得探讨的问题,首先我们必须先知道,hashcode与equals方法到底是什么东西?
这个是在最顶层父类的hashcode与equals方法,看过我之前文章的朋友一定知道,native关键字的意义,这个其实是可以用别的语言在java中来操作底层的东西。
下面是我翻译的java对于hashcode的官方注解:
/**
* Returns a hash code value for the object. This method is
* supported for the benefit of hash tables such as those provided by
* {@link java.util.HashMap}.
* <p>
* The general contract of {@code hashCode} is:
* <ul>
* <li>Whenever it is invoked on the same object more than once during
* an execution of a Java application, the {@code hashCode} method
* must consistently return the same integer, provided no information
* used in {@code equals} comparisons on the object is modified.
* This integer need not remain consistent from one execution of an
* application to another execution of the same application.
* <li>If two objects are equal according to the {@code equals(Object)}
* method, then calling the {@code hashCode} method on each of
* the two objects must produce the same integer result.
* <li>It is <em>not</em> required that if two objects are unequal
* according to the {@link java.lang.Object#equals(java.lang.Object)}
* method, then calling the {@code hashCode} method on each of the
* two objects must produce distinct integer results. However, the
* programmer should be aware that producing distinct integer results
* for unequal objects may improve the performance of hash tables.
* </ul>
* <p>
* As much as is reasonably practical, the hashCode method defined by
* class {@code Object} does return distinct integers for distinct
* objects. (This is typically implemented by converting the internal
* address of the object into an integer, but this implementation
* technique is not required by the
* Java™ programming language.)
*
* @return a hash code value for this object.
* @see java.lang.Object#equals(java.lang.Object)
* @see java.lang.System#identityHashCode
*/
返回对象的哈希码值。这种方法是 * 支持哈希表,例如提供的哈希表 * {@link java.util.HashMap}。 * <p> * {@code hashCode} 的通用合约为: * <ul> * <li>每当它在同一个对象上被多次调用时 * Java 应用程序的执行,{@code hashCode} 方法 * 必须始终返回相同的整数,不提供任何信息 * 用于对象的 {@code equals} 比较被修改。 * 这个整数不需要在一次执行中保持一致 * 应用程序到另一个执行相同的应用程序。 * <li>如果两个对象根据{@code equals(Object)}相等 * 方法,然后对每个调用 {@code hashCode} 方法 * 两个对象必须产生相同的整数结果。 * <li><em>不</em>要求两个对象不相等 * 根据 {@link java.lang.Object#equals(java.lang.Object)} * 方法,然后在每个对象上调用 {@code hashCode} 方法 * 两个对象必须产生不同的整数结果。但是,那 * 程序员应该知道产生不同的整数结果 * 对于不相等的对象可能会提高哈希表的性能。 * </ul> * <p> * 在合理可行的情况下,hashCode 方法定义为 * 类 {@code Object} 确实为不同返回不同的整数 * 对象。 (这通常是通过转换内部实现 * 将对象的地址转换成整数,但是这个实现 *技术不是必需的 * Java™编程语言。) * * @return 此对象的哈希码值。 * @see java.lang.Object#equals(java.lang.Object) * @see java.lang.System#identityHashCode
首先这个注解是非常官方的,虽然翻译过来很生硬但是外面还是读出很多关键信息。
1.hashcode方法返回的哈希吗值,这个值的计算是基于哈希表与哈希算法的。。Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
2.在一个程序被执行的期间,同一个对象必须返回相同的hashcode值。
3.如果两个对象根据equals(Object)产生相同的返回值,那么它们的hashcode值就必须相等。但是两个对象不相同确实也可能会返回相同的hashcode值。这个就被称为“哈希冲突”。
4.hash值通常是通过内部转换实现的,将对象的地址转换为整数,但是这个技术不是依靠java语言实现的。
通过管反复注解的阅读我们已经明白了,什么是hashcode。但是这么用的意义到底在哪里呢?其实我们仔细思考,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,如果有那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。这样我们就不用一次次去比较地址,这样对程序的速率提升是巨大的。
所以我们不难理解hashcode不能代替地址,它只是基于地址的映射。根据 {@code hashCode} 的通用合约:两个对象的地址相同,那么它们的hashcode值就必须相同。而对应的是两个对象的hashcode值不同那么它们的地址就一定不同。但是存在两个地址不同但是hashcode值相同的情况。哈希类存储结构(HashSet、HashMap等等)添加元素会有重复性校验,校验的方式就是先取hashCode判断是否相等(这个位置通过哈希算法可能存在多个元素),这个时候即需要通过equals方法比较(极大缩小比较范围,高效判断),最终判定该存储结构中是否有重复元素。
所以对于这个问题重写equals方法就一直要重写hashcode方法。但是如果你是要重写hashcode方法就不一定需要重写equals方法。
重写hashcode方法需要重写equals方法吗?为什么?相关推荐
- 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...
- python字符串equals方法_编写equals方法
我们知道List是一种有序链表:List内部按照放入元素的先后顺序存放,并且每个元素都可以通过索引确定自己的位置. List还提供了boolean contains(Object o)方法来判断Lis ...
- 重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
转载请注明出处: http://blog.csdn.net/javazejian/article/details/51348320 今天这篇文章我们打算来深度解读一下equal方法以及其关联方法has ...
- why在重写equals时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
- 为什么重写equals时必须重写hashCode方法?
2019独角兽企业重金招聘Python工程师标准>>> 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashco ...
- 重写equals方法一定要重写HashCode方法
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intVa ...
- java中equals函数所在的类,重写Java中的equals方法介绍
Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...
- Java——重写hashCode()和euqals()方法
1.顺序表的问题 查找和去重效率较低 对于这样的顺序表来说,如果需要查找元素,就需要从第一个元素逐个检查,进行查找.对于需要去重的存储来说,每次存入一个元素之前,就得将列表中的每个元素都比对一遍,效率 ...
- 【Java基础】重写equals方法详讲
一.重写equals方法 [Java比较学习]重写equals方法的安全写法 1.重写equals方法的两种方式 这里提供两个比较常见的equals重写方法: ● 用instanceof实现重写equ ...
- 【IDEA】快捷重写equals方法
object提供的equals方法 idea提供快速重写equals方法 快捷键:alt+insert–>选择equals() and hashCode() 选择next 创建equals方法默 ...
最新文章
- 音视频(H264+G711)打包AVI文件
- ELK学习7_ELK文档资料:《ELK stack 权威指南/饶琛琳》勘误
- [html] 你认为写出什么样的html代码才是好代码呢?
- Squid服务日志分析
- 如何编写提供了IDisposable接口的类.
- Atitit 业务领域体系分类 目录 1. 按照互联网企业类型以及只是体系类的分类	2 2. 电子商务	2 3. **通信类社交 Im类 em	2 4. **信息搜索类爬虫	2 4.1. 媒体
- 重庆python爬虫培训_PYTHON爬虫工程师
- FreeRTOS学习笔记——FreeRTOS 时间管理
- 水花兄弟(Splash Brothers)
- 搜索开启WPS功能的路由wash
- 两台计算机的ip地址怎么配置,同一台电脑如何设置两个IP地址?电脑配置双ip地址图文教程...
- extern 用法简单示例
- 罗克韦尔自动化收购MESTECH Services
- Spring监听器的完整使用步骤
- Nano Today(IF=21)| 北京大学齐宪荣团队通过原位重编程巨噬细胞增强肿瘤免疫治疗效果
- ptrhon GUI编程
- android 播放3gp音频,说说 Android 中如何操作音频与视频文件
- 百胜图CTI拉花比赛上海总决赛
- Packet Tracer - 使用 CLI 配置并验证站点间 IPsec VPN
- [附源码]JAVA+ssm计算机毕业设计安庆师范大学校园互助平台(程序+Lw)
热门文章
- 2020寒假【gmoj2417】【Loan Repayment】【二分】
- C语言学习笔记1——零散基础知识
- Oracle学习——第四讲(增删改查)
- 数美2022:不惧势,不却步,逐浪有为
- 暑期机器学习小组读书报告----机器学习概述
- android相机权限xml,Android相机权限检测兼容问题
- Windows Setup could not set the display language
- [ZJOI2015]醉熏熏的幻想乡
- python能做些什么事_一起来看看Python能干什么?使用Python能做哪些事
- 微信小程序开发案例2---省市区信息选择