java 为什么重写equals一定要重写hashcode?
前言
最近复习,又看到了这个问题,在此记录和整理,通过例子来说明这种情况的原因,使大家可以清晰明白这个问题。
初步探索
首先我们要了解equals方法是什么,hashcode方法是什么。
equals方法
equals 是java的obejct类的一个方法,equals的源码如下:
public boolean equals(Object paramObject){return(this == paramObject);
}
由此我们可以看到equals是用来比较两个对象的内存地址是否相等。
hashCode方法
hashCode方法是本地方法,用于计算出对象的一个散列值,用于判断在集合中对象是否重复的关键。
一条定理
equals相同的对象,hashCode必然相同。
代码示例
建立一个Student类。
public class Student {private String name;private int age;private String QQ;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name) &&Objects.equals(QQ, student.QQ);}
}
在 student 类中,我们重写了equals方法。
书写一个测试类
public class Test {public static void main(String[] args) {Student student = new Student();Student student2 = new Student();System.out.println(student.equals(student2)); //trueSystem.out.println(student.hashCode()); //356573597System.out.println(student2.hashCode()); //1735600054 HashMap<Student, String> map = new HashMap<>();map.put(student,"123");map.put(student2,"456");System.out.println(map.get(student));System.out.println(map.get(student2));}
}
输出
true
356573597 student 的hashcode值
1735600054 student 2的hashcode值
123
456
此时,我们发现 equals 相等的对象,hashcode却不相等,同时在map中用不同的对象进行了存储,map计算出来的hash值不同,但equals却相同。这时候懵了。到底两个对象一样不一样呢。
所以我们在重写equals的时候,必须重写hashcode。
重新定义 student 类
public class Student {private String name;private int age;private String QQ;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name) &&Objects.equals(QQ, student.QQ);}@Overridepublic int hashCode() {return Objects.hash(name, age, QQ);}
}
再次测试
public class Test {public static void main(String[] args) {Student student = new Student();Student student2 = new Student();System.out.println(student.equals(student2)); //trueSystem.out.println(student.hashCode()); // 29791 System.out.println(student2.hashCode()); // 29791 HashMap<Student, String> map = new HashMap<>();map.put(student,"123");map.put(student2,"456");System.out.println(map.get(student)); //456System.out.println(map.get(student2)); //456}
}
最后的输出
true
29791 //相同的对象
29791
456 //说明以一个值key存储,相同的值
456
几条定理
1、两个对象的equals相等,hashcode必然相等。
2、两个对象不等,hashcode也可能相等。
3、hashcode相等,对象不一定相等。
4、hashcode不等,对象一定不等。
java 为什么重写equals一定要重写hashcode?相关推荐
- java equals重写原则_java中为何重写equals时必须重写hashCode方法详解
前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...
- Java入门集合之Set集合(重写equals()和hashcode()方法)
概述 Set接口继承Collection Set接口常用实现类 HashSet 实现了 Set 接口 "它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变"(存入该实现类对 ...
- 为什么重写equals一定要重写hashCode方法?
大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...
- 为什么重写Equals方法要重写HashCode方法
目录 1.equals方法 2.hashcode方法 3.hash算法 4.重写equals方法 5.重写HashCode方法 在每个类中,重写equals方法的时侯,一定要重写hashcode方法. ...
- 重写equals为什么要重写hashcode
一.equals()方法 equals是Object类的一个公有方法,在Java中,所有的类都会继承Object(包括数组),所以所有的类都有equals方法.他的用途也很明了,就是比较两个对象是否相 ...
- 为什么重写equals一定要重写hashcode?
引言 这篇文章已经是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我又写了一篇,链接如下: CSDN链接:彻底搞懂为什么重写equals还要重写hashcode? 微信公众号链 ...
- 为什么重写equals方法必须重写hashcode方法
想要知道这个问题,首先需要知道hashcode它的作用: HashCode的作用: 首先来看HashCode的作用,当把对象加入HashSet中时,HashSet会先计算对象的hashcode值来判断 ...
- Java的重写equals但不重写hashCode方法的影响
首先,说下equals和hashCode的关系.JDK API中关于Object类的equals和hashCode方法中说过,总结起来就是两句话:equals相等的两个对象的hashCode也一定相等 ...
- 重写equals就必须重写hashCode的原理分析
因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...
最新文章
- python 倒计时_用Python帮你远离猝死悲剧
- 找不到或无法加载主类
- 图片爬取数据解析数据持久化
- leetcode 1030. 距离顺序排列矩阵单元格(bfs)
- Python爬虫实现:三连文章参与抽奖
- Python学习笔记_文件读写,目录遍历类封装
- 历年二级c语言考试真题及答案,历年全国计算机等级考试二级C语言笔试选择真题及答案...
- 亲身经历:2018年深圳保洁员工资时薪75,月薪不清楚
- 2017年计算机类核心期刊,2017年北大版中文核心期刊要目总览目录.pdf
- 【游戏开发框架】自制Unity通用游戏框架UnityXFramework,详细教程(Unity3D技能树 | tolua | 框架 | 热更新)
- Zabbix监控MySQL工具
- 服务器过载或维修,服务器过载怎么解决
- Excel求和公式的几种用法
- 阿里 P6 面试体验
- 利用阿里云短信找回密码 SpringBoot集成Mybatis
- 重新理了下思路一个人的孤独
- 世界上最全的防醉酒+解酒法(为了关心的人,一定要看看哦)
- 【算法】求解幂集问题
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)...
- ffmpeg ——下载与安装
热门文章
- mysql嵌套实战_艰难的mysql嵌套表结果挑战
- c++max函数怎么用_比函数还强大的Excel分列技巧,你知道怎么用吗
- 皮一皮:家里出了个不孝子...
- 皮一皮:双11到底买了啥...
- 皮一皮:论圈子的重要性!
- 云服务双十一大促,最后选手阿里云上场!没有让等到最后的用户失望!
- pytorch 单机多卡训练distributedDataParallel
- python strip
- PyTorch基于Apex的混合精度加速
- TeamViewer 14 on Nvidia Jetson TX2