前言

最近复习,又看到了这个问题,在此记录和整理,通过例子来说明这种情况的原因,使大家可以清晰明白这个问题。

初步探索

首先我们要了解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?相关推荐

  1. java equals重写原则_java中为何重写equals时必须重写hashCode方法详解

    前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...

  2. Java入门集合之Set集合(重写equals()和hashcode()方法)

    概述 Set接口继承Collection Set接口常用实现类 HashSet 实现了 Set 接口 "它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变"(存入该实现类对 ...

  3. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  4. 为什么重写Equals方法要重写HashCode方法

    目录 1.equals方法 2.hashcode方法 3.hash算法 4.重写equals方法 5.重写HashCode方法 在每个类中,重写equals方法的时侯,一定要重写hashcode方法. ...

  5. 重写equals为什么要重写hashcode

    一.equals()方法 equals是Object类的一个公有方法,在Java中,所有的类都会继承Object(包括数组),所以所有的类都有equals方法.他的用途也很明了,就是比较两个对象是否相 ...

  6. 为什么重写equals一定要重写hashcode?

    引言 这篇文章已经是我很久之前写的,其中的内容表述得不太清楚,或多或少难以让人信服,于是我又写了一篇,链接如下: CSDN链接:彻底搞懂为什么重写equals还要重写hashcode?  微信公众号链 ...

  7. 为什么重写equals方法必须重写hashcode方法

    想要知道这个问题,首先需要知道hashcode它的作用: HashCode的作用: 首先来看HashCode的作用,当把对象加入HashSet中时,HashSet会先计算对象的hashcode值来判断 ...

  8. Java的重写equals但不重写hashCode方法的影响

    首先,说下equals和hashCode的关系.JDK API中关于Object类的equals和hashCode方法中说过,总结起来就是两句话:equals相等的两个对象的hashCode也一定相等 ...

  9. 重写equals就必须重写hashCode的原理分析

    因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...

最新文章

  1. python 倒计时_用Python帮你远离猝死悲剧
  2. 找不到或无法加载主类
  3. 图片爬取数据解析数据持久化
  4. leetcode 1030. 距离顺序排列矩阵单元格(bfs)
  5. Python爬虫实现:三连文章参与抽奖
  6. Python学习笔记_文件读写,目录遍历类封装
  7. 历年二级c语言考试真题及答案,历年全国计算机等级考试二级C语言笔试选择真题及答案...
  8. 亲身经历:2018年深圳保洁员工资时薪75,月薪不清楚
  9. 2017年计算机类核心期刊,2017年北大版中文核心期刊要目总览目录.pdf
  10. 【游戏开发框架】自制Unity通用游戏框架UnityXFramework,详细教程(Unity3D技能树 | tolua | 框架 | 热更新)
  11. Zabbix监控MySQL工具
  12. 服务器过载或维修,服务器过载怎么解决
  13. Excel求和公式的几种用法
  14. 阿里 P6 面试体验
  15. 利用阿里云短信找回密码 SpringBoot集成Mybatis
  16. 重新理了下思路一个人的孤独
  17. 世界上最全的防醉酒+解酒法(为了关心的人,一定要看看哦)
  18. 【算法】求解幂集问题
  19. 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)...
  20. ffmpeg ——下载与安装

热门文章

  1. mysql嵌套实战_艰难的mysql嵌套表结果挑战
  2. c++max函数怎么用_比函数还强大的Excel分列技巧,你知道怎么用吗
  3. 皮一皮:家里出了个不孝子...
  4. 皮一皮:双11到底买了啥...
  5. 皮一皮:论圈子的重要性!
  6. 云服务双十一大促,最后选手阿里云上场!没有让等到最后的用户失望!
  7. pytorch 单机多卡训练distributedDataParallel
  8. python strip
  9. PyTorch基于Apex的混合精度加速
  10. TeamViewer 14 on Nvidia Jetson TX2