为什么重写equals时必须重写hashCode方法?
2019独角兽企业重金招聘Python工程师标准>>>
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = count;if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {if (v1[i++] != v2[j++])return false;}return true;}}return false;}/*返回哈希码,String的哈希码计算方式为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]*/ public int hashCode() {int h = hash;if (h == 0) {int off = offset;char val[] = value;int len = count;for (int i = 0; i < len; i++) {h = 31*h + val[off++];}hash = h;}return h;}
那为什么在重写equals方法时都要重写hashCode方法呢:
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
自我的理解:
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。
继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。
转载于:https://my.oschina.net/u/3787897/blog/1631713
为什么重写equals时必须重写hashCode方法?相关推荐
- java equals重写原则_java中为何重写equals时必须重写hashCode方法详解
前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...
- 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...
- 面试官:重写 equals 时为什么一定要重写 hashCode?
作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...
- Java的重写equals但不重写hashCode方法的影响
首先,说下equals和hashCode的关系.JDK API中关于Object类的equals和hashCode方法中说过,总结起来就是两句话:equals相等的两个对象的hashCode也一定相等 ...
- Java入门集合之Set集合(重写equals()和hashcode()方法)
概述 Set接口继承Collection Set接口常用实现类 HashSet 实现了 Set 接口 "它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变"(存入该实现类对 ...
- 为什么重写equals一定要重写hashCode方法?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...
- 重写equals为什么要重写hashcode
一.equals()方法 equals是Object类的一个公有方法,在Java中,所有的类都会继承Object(包括数组),所以所有的类都有equals方法.他的用途也很明了,就是比较两个对象是否相 ...
- 为什么重写equals一定要重写hashcode?
引言 这篇文章已经是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我又写了一篇,链接如下: CSDN链接:彻底搞懂为什么重写equals还要重写hashcode? 微信公众号链 ...
- why在重写equals时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
最新文章
- 转png格式_CAD转PNG,你知道怎样转换成高质量清晰的黑白图片吗?
- 获取Docker中容器的信息
- 1.1节 Buck Converter--降压转换器 part1
- 使用async,await关键字进行API Access Token的获取
- mysql mac 中文乱码_Mac mysql 解决中文乱码
- android 渠道方案,Android多渠道打包时获取当前渠道的方法
- LeetCode 260. Single Number III
- 带有自定义适配器示例教程的Android ListView
- python异常捕获try except
- 安卓逆向 | 某新闻类APP urlSign
- cad如何多选对象_cad中选择对象,不小心多选了一条线,怎么取消这个多选的家伙...
- WeWork中国实现全面本土化运营;巴黎欧莱雅沙龙专属全球首家旗舰沙龙开业 | 美通企业日报...
- VS2008 简体中文正式版序列号(到期解决办法)
- 2021-06-30
- TLC5615 10位DA模块数模转换芯片驱动
- 简历求职01:STAR法则
- mac 设置网红屏保
- 登录界面——渗你千千万万遍
- Java基础:方法和类详解
- ssm问题记录:NoSuchBeanDefinitionException: No qualifying bean of type ‘xxxl‘ available
热门文章
- Mysql经常使用命令
- powershell加win的dns服务器,解决网站负载均衡问题
- Java volatile关键字
- 301重定向IIS设置,及伪静态后 301重定向出错案例分享
- xml中的Document和Attribute
- java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令
- 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...
- android 开机动画尺寸,Android开机Logo动画制作
- html5显示字母的值,使用HTML5 Canvas API控制字体的显示与渲染的方法
- unzip 解压_每天一条Linux命令(11) unzip (超详细)