why在重写equals时还必须重写hashcode方法
首先我们先来看下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;
}
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方法时都要重写equals方法呢:
首先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确实不相同的
why在重写equals时还必须重写hashcode方法相关推荐
- java -为什么重写equals(),还需要重写hashCode()?
1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...
- 面试官:重写 equals 时为什么一定要重写 hashCode?
作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...
- 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...
- 为什么重写equals()就一定要重写hashCode()方法
Object类,所有类的父类 一.为什么重写equals()方法一定要重写hashCode()方法 1.首先解释equals方法和hashcode方法分别是用来干什么的? equals()方法: 在O ...
- java延迟覆盖_高效Java第九条覆盖equals时总要覆盖hashCode
原标题:高效Java第九条覆盖equals时总要覆盖hashCode 高效Java第九条覆盖equals时总要覆盖hashCode 在每个覆盖了equals方法的类中,也必须覆盖hashCode方法. ...
- java equals重写原则_java中为何重写equals时必须重写hashCode方法详解
前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...
- 为什么重写equals时必须重写hashCode方法?
2019独角兽企业重金招聘Python工程师标准>>> 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashco ...
- java 重写equals的要点_重写equals 方法的注意事项
java.lang.Object 中的equals方法如下 public boolean equals(Object obj) { return (this == obj); } 什么时候需要重写eq ...
- java代码优化equal_java代码优化——覆盖equals时总要覆盖hashCode
HashCode规范 一个很常见的错误根源在于没有覆盖hashCode方法.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法.如果不这样的话,就会违反Object.hashCode的 ...
最新文章
- javascript高级教程
- 关于举办第十五届全国大学生智能汽车竞赛浙江赛区选拔赛的通知
- CAST 和 CONVERT的用法和区别
- firefox和chrome中 JQuery的ajax组件执行差异
- 现在的计算机专业(比如机器学习)已经沦为调包专业了吗?
- python数据结构和算法3 栈、队列和排序
- SAP gateway 后台OData model data查看工具
- 经典面试题(46):以下代码将输出的结果是什么?
- super方法 调用父类的方法
- uniapp不同页面跳转传递数据
- nopcommerce插件深度剖析
- SQL中Case的使用方法(上篇)
- Linux 入侵排查
- 有道单词本手机和电脑同步问题
- android6.0相机权限申请
- SpringBoot项目实现微信小程序登录步骤
- 【新书速递】深入浅出Electron
- 【框架思路】python如何读取excel文件内容?如何获取excel文件的路径及sheet名称?
- 2. Hibernate目录结构和基础JAR包介绍
- Java字符串反转常用的2种方式
热门文章
- 普通视图和物化视图区别
- mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...
- Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
- PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
- PHP应对洪水般的恶意访问接口 访问冲击
- PHP的postman请求的五种数据样式
- oracle创建表时创建序列号,oracle表中怎么建序列
- java ajax json 解析json数组对象数组对象数组对象数组_ajax传递包含对象数组的json数据...
- oracle存储过程多条件判断,oracle存储过程条件替空的判断(2)
- matlab 填充数组,Matlab自动将数组类型从复数转换为double