为什么重写equals方法,还必须要重写hashcode方法
原因:
1.为了提高效率
采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用。
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。
2.为了保证同一个对象
保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。
hash类存储结构(HashSet、HashMap等等)添加元素会有重复性校验,校验的方式就是先取hashCode判断是否相等(找到对应的位置,该位置可能存在多个元素),然后再取equals方法比较(极大缩小比较范围,高效判断),最终判定该存储结构中是否有重复元素。
总结:
1.提高效率。hash类型的存储结构,添加元素重复性校验的标准就是先取hashCode值,后判断equals()。重写后,使用hashcode方法提前校验,可以避免每一次比对都调用equals方法。
2.保证是同一个对象。如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。
重写后两个方法的关系:
equals()相等的两个对象,hashcode()一定相等;
hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。
所以先进行hashcode()判断,不等就不用equals()方法了。
但equels是是根据对象的特征进行重写的,有时候特征相同,但hash值不同,也不是一个对象。 所以两个都重写才能保障是同一个对象。
添加链接描述
为什么重写equals方法,还必须要重写hashcode方法相关推荐
- 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...
- java -为什么重写equals(),还需要重写hashCode()?
1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...
- 面试官:重写 equals 时为什么一定要重写 hashCode?
作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...
- JavaSE——为什么重写equals的同时一定要重写hashCode?
文章目录: 1.引出话题 2.关于equals方法 3.关于hashCode方法 4.为什么要一起重写这两个方法? 5.总结 1.引出话题 equals 方法和 hashCode 方法是 Object ...
- why在重写equals时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
- java重写面试题_Java面试题:重写了equals方法,为什么还要重写hashCode方法?
核心问题:重写了equals方法,为什么还要重写hashCode方法? 这不仅仅是一道面试题,而且是关系到我们的代码是否健壮和正确的问题.在前面两篇文章涉及到了equals方法的底层讲解:<说说 ...
- 面试题:重写equals方法为什么通常会重写hashcode方法?
最近在面试的时候,当问完了HashMap的数据结构之后,通常会再多问一个问题,就是:重写equals方法时通常为什么也要重写一下hashcode方法? 其实这个问题,本质上又回到HashMap的应用场 ...
- Java 细品 重写equals方法 和 hashcode 方法
前言 在我们需要比较对象是否相等时,我们往往需要采取重写equals方法和hashcode方法. 该篇,就是从比较对象的场景结合通过代码实例以及部分源码解读,去跟大家品一品这个重写equals方法和h ...
- java中equals的重写_Java重写equals方法(重点讲解)
为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...
- 为什么重写equals一定要重写hashCode方法?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...
最新文章
- linux安装node js的二进制文件安装方式的注意事项
- python在线工具-6 种 Python 数据可视化工具
- 安卓程序添加指纹解锁功能
- android IntentService
- dict去重python_python去重,一个由dict组成的list的去重示例
- [推荐] 世界上最健康的作息时间表
- JSON.NET 5中的架构变更
- C# .net 对图片操作
- calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
- java中字符串(2)String
- aspx怎么转成java,Asp.net 2.0 中.aspx请求,即如何生成响应的Html文件(原创)
- 让我们用 SQL 开发一个图形数据库吧
- 博客园北京俱乐部第二次技术活动(2009/4/4)总结
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
- Bake into Pose的设置以及动画系统的一些疑惑和如何实验
- php底部导航栏,微信小程序之底部导航栏目开发(附代码)
- 241.为运算表达式设计优先级
- 【ENVI入门系列】02.自定义坐标系(北京54、西安80、2000坐标系)
- 电脑可以连接手机热点,却无法连路由器无线wifi
- 相对论中光速恒定,时间可变的原理