重写equals为啥需要重写hashCode
描述
以前一直记得重写equals要把hashCode也要重写了,但是一直也是没有搞明白,
最近在看一些东西,觉得有必要记录一下。
了解一下equals
equals是Object类的方法,

equals是干什么用的
这个方法的作用是比较两个对象是否相等的,可能有人会问了,使用==号不就可以比较了,
为啥非得使用equals方法呢。
假设你有一个Student类,系统认为一个学生的学号只要相同就默认为是同一个学生,
public class Student {
private String IdCard;
}
如下:
Student xiaoming=new Student("110");
Student xm=new Student("110");
如果使用==判断得到的结果肯定是false,因为这是两个对象,地址肯定不相同。
如果重写equals方法
public class Student {
private String IdCard;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return IdCard != null ? IdCard.equals(student.IdCard) : student.IdCard == null;
}
}
然后使用equals方法比较(xiaoming.equals(xm))就可以得到true。
但是为什么非得重写hashCode方法
因为不重写hashCode在使用Hash集合(HashMap、HashTable、HashSet)的时候会出现问题。
如果Student类重写了equals方法没有重写hashcode方法:
Student xiaoming=new Student("110");
Student xm=new Student("110");
HashMap<Student,String> map=new HashMap<Student,String>();
map.put(xiaoming,"小明");
map.put(xm,"小明");
执行map.size() 我们想要得到的结果是:1,但是执行的结果是:2 ;
这是因为hashmap首先比较的是两个对象的hashcode值,如果你没有重写Student类的hashCode方法,默认是按照对象内存的地址进行哈希运算得到的,这两个对象的地址肯定不一样,所以HashMap认为它不是同一个对象,就放入了集合中。
我们添加hashCode方法的重写:
public class Student {
private String IdCard;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return IdCard != null ? IdCard.equals(student.IdCard) : student.IdCard == null;
}
@Override
public int hashCode() {
return IdCard != null ? IdCard.hashCode() : 0;
}
}
再次执行上面的代码就得到的结果就是:1;说明已经认为这两个对象是同一个了。
建议
大家用IDE自动生成,尽量不要自己敲因为很有可能会出错。
重写equals为啥需要重写hashCode的更多相关文章
- 为什么重写equals时必须重写hashCode方法?(转发+整理)
为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...
- 为什么重写 equals 方法 必须重写 hashCode
自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来 为什么重写 equals 方法 必须重写 hashCode 如果你重写了equals,比如说是基于对象的内容实现的,而不重写 ...
- 讲解:为什么重写equals时必须重写hashCode方法
一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...
- 为什么重写equals一定要重写hashCode?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解. ...
- 为什么重写equals后要重写hashCode
equals和hashCode的关系 要搞清楚题目中的问题就必须搞明白equals方法和hashCode方法分别是什么,和诞生的原因,当搞明白了这一点其实题目就不算是个问题了,下面我们来探讨分别探讨一 ...
- java中为什么重写equals时必须重写hashCode方法?
在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCod ...
- 为什么重写equals一定要重写hashCode方法?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...
- java 中为什么重写 equals 后需要重写 hashCode
本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...
- 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode
建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Pe ...
随机推荐
- SpringBoot下实现MongoDB字段类型转换器
1 目的 MongoDB Java String LocalDateTime 2 实现 先定义实体类 @Data // lombok @Accessors(chain = true) @Documen ...
- _stscanf_s (sscanf)正则表达式
_stscanf_s (sscanf)正则表达式 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}, 注 ...
- Git忽略已追踪文件或文件夹
今天拉取代码,用vs生成后发现obj文件夹下自动生成的文件被同事提交了,这个本应该加入到ignore的 我就需要把这个文件夹加入到gitignore, 不过已经追踪的文件和文件夹,直接添加到gitig ...
- HTML导航条的制作
导航条的制作HTML代码:<nav> <ul> <li> <a href="#"></a> </li> &l ...
- dedecms Fatal error: Out of memory
max_execution_time = 300 php执行持续最长时间 比如:网站全站更新max_input_time = 30 php传送数据最长时间 比如:上传大文件memory_l ...
- 解决Python中出现的问题: “You are using pip version 9.0.1, however version 19.2.3 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.”
1. 一开始我在使用Pycharm时,导入numpy库,发现导入错误: Non-zero exit code (1) 2. 于是我通过更新的方法来解决,哪知道在更新的时候也出现了错误,错误如下图: 这 ...
- Windows&Appium&Python自动化测试-环境搭建之安卓SDK
一.摘要 本博文将详细讲述在Windows环境下的jdk安装.配置以及环境校验:安卓sdk安装.配置以及环境校验 二.安装包工具准备: jdk1.8.0(64 位) installer_r24.4.1 ...
- 特殊变量的处理(一)onehot&dummy
表述类目的变量通常,通常没有次序概念,且取值范围有限.例如性别行业信用卡类型.有些模型可以直接读类别变量(例如决策树).有些模型不能识别类别变量(例如回归模型,神经网络,有距离的度量模型(svn,kn ...
- 利用collections下的counter实现对列表重复元素的查重
mylist = [0,1,1,2,2,3,3,3,3,4,5,6,7,7,8,8,9,10,10,11,22,33,22] from collections import Counter c = C ...
- Serializable(转)
最近在阅读JDK源码中的集合,看到很多集合类实现了Serializable接口,Cloneable接口.在阅读了很多关于Serializable接口的博客后,浅谈下我对Serializable接口的理 ...