为什么重写equals必须重写hashCode的基础分析

1.我们先来了解下原生的equals和hashCode代码

  原生equals:它判断的是两个对象是否相等

  原生hashCode值:它是根据内存地址换算出来的一个整数类型的值

2.至于为什么要重写equals和hashCode?

  当然为了满足我们具体的业务需求啦,毕竟我们不一定只比较对象相等嘛

3.做一个超简单小案例来理解下(包名不规范,切勿模仿);

(1)创建一个Student类,不重写equals和hashCode

package 重写equal必须重写hashcode;

public class Student {
public String id; //学生的id
public String name; //学生的名字 public Student() {
super();
// TODO Auto-generated constructor stub
} public String toString() {
return id + ":" + name;
} public Student(String id, String name) {
super();
this.id = id;
this.name = name;
} }

  (2)new一个hashSet,分别添加三个student

package 重写equal必须重写hashcode;

import java.util.HashSet;

public class Test {

	//学生ID和姓名都相同我们视为重复
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Student("001","小明"));
hs.add(new Student("002","小花"));
hs.add(new Student("002","小花"));
System.out.println(hs);
}
}

  (3)运行结果如下:

(4)我们可以看到,信息出现了重复;new的对象不同生成的hashCode值不同,所以hashSet会把三个Student对象当作不同的对象。

2.接下来我们重写equals而不重写hashCode

(1)重写equals后代码如下:

package 重写equal必须重写hashcode;

public class Student {
public String id; //学生的id
public String name; //学生的名字 public Student() {
super();
// TODO Auto-generated constructor stub
} public String toString() {
return id + ":" + name;
} public Student(String id, String name) {
super();
this.id = id;
this.name = name;
} public boolean equals(Object obj) {
if(this == obj) { //判断是否是同一对象
return true; //同一类型返回true(跟自己比较)
}
if(getClass()!=obj.getClass()) { //判断是否为同一类型
return false; //不是同类型返回false(类型不同肯定为不同的对象)
}
Student stu = (Student)obj; //强制转换成Student类型
boolean result = this.id.equals(stu.id); //判断ID是否相等
return result; //返回判断结果
}
}

 (2)现在我们运行下,结果如下图:

(3)可以发现重复的信息没有删除掉,可以判断添加Student对象没有调用equals方法,而是根据hashCode值的不同,hashSet就认为三个对象不相等。

3.最后我们重写equals和hashCode;

(1)重写hashCode;

package 重写equal必须重写hashcode;

public class Student {
public String id; //学生的id
public String name; //学生的名字 public Student() {
super();
// TODO Auto-generated constructor stub
} public String toString() {
return id + ":" + name;
} public Student(String id, String name) {
super();
this.id = id;
this.name = name;
} public boolean equals(Object obj) {
if(this == obj) { //判断是否是同一对象
return true; //同一类型返回true(跟自己比较)
}
if(getClass()!=obj.getClass()) { //判断是否为同一类型
return false; //不是同类型返回false(类型不同肯定为不同的对象)
}
Student stu = (Student)obj; //强制转换成Student类型
boolean result = this.id.equals(stu.id); //判断ID是否相等
return result; //返回判断结果
} public int hashCode() { //重写hashCode
return id.hashCode(); //返回ID属性的哈希值
}
}

 (2)运行结果如下:

(3)是不是就把重复的信息移除了呢?哈哈

如果有不妥之处,请各位大佬多多包涵,这些也是个人的理解

如果你有补充,欢迎留下你的意见在评论区!

为什么重写equals必须重写hoshCode的基础分析的更多相关文章

  1. 为什么重写equals还要重写hashcode??

    equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...

  2. 为什么重写equals必须重写hashCode

    目录 equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上 ...

  3. JAVA 重写equals和重写hashCode

    面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” 首先你需要了解: hashCode()的作用是获取哈希码(散列码) 它实 ...

  4. 【Java基础】重写equals需要重写hashcode

    Object里的equals用来比较两个对象的相等性,一般情况下,当重写这个方法时,通常有必要也重写hashcode,以维护hashcode方法的常规协定,或者说这是JDK的规范,该协定声明相等对象必 ...

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

    参考回答: HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两 ...

  6. 谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法

    HashSet的存储原理: 1.将要传入的数据根据系统的hash算法得到一个hash值: 2.根据hash值可以得出该数据在hash表中的位置: 3.判断该位置上是否有值,没有值则把数据插入进来:如果 ...

  7. 关于重写equals同时重写hashcode

    1.Object中equals方法和hashcode public boolean equals(Object obj) { return (this == obj); } public native ...

  8. 为什么重写equals()就要重写hashcode()

    阿里巴巴开发规范 只要重写 equals,就必须重写 hashCode 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方 ...

  9. 为什么重写equals()必须重写hashCode()

    主要原因是因为hashCode是用对象的内部地址转换成一个整数的,而equals比较得是两个对象,或者是两个对象的内容 如果你重写了equals,而保留hashCode的实现不变,那么很可能两个对象明 ...

随机推荐

  1. DirectX12 3D 游戏开发与实战第三章内容

    变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...

  2. Java NIO之理解I/O模型(二)

    前言 上一篇文章讲解了I/O模型的一些基本概念,包括同步与异步,阻塞与非阻塞,同步IO与异步IO,阻塞IO与非阻塞IO.这次一起来了解一下现有的几种IO模型,以及高效IO的两种设计模式,也都是属于IO ...

  3. 脱离脚手架来配置、学习 webpack4.x (二)基础搭建loader 配置 css、scss

    序 上一篇已经把基本架子搭起来了,现在来增加css.scss.自动生成html.css 提前等方面的打包.webpack 默认只能处理js模块,所以其他文件类型需要做下转换,而loader 恰恰是做这 ...

  4. 【面试】我是如何在面试别人Redis相关知识时“软怼”他的

    事出有因 Redis是一个分布式NoSQL数据库,因其数据都存储在内存中,所以访问速度极快,因此几乎所有公司都拿它做缓存使用,所以Redis常被称为分布式缓存. 一次我的一个同事让我帮他看Redis相 ...

  5. 3D 飞行器航迹规划

    3D-Route-Planning 三维航迹规划 -Matlab 本次代码主要解决数学建模中多约束条件下的航迹规划问题 解决的问题如下:   复杂环境下航迹快速规划是智能飞行器控制的一个重要课题.由于 ...

  6. js---电商中常见的放大镜效果

    js中的放大镜效果 在电商中,放大镜效果是很常见的,如下图所示: 当鼠标悬浮时,遮罩所在区域在右侧进行放大. 在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完 ...

  7. 对象实例Vue

    var vm = new Vue({ el:'#app', data:{}, //数据 methods:{}, //方法调用 filters:{}, //私有过滤器 directives:{}, // ...

  8. Scrapy项目 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    通过使Scrapy框架,进行数据挖掘和对web站点页面提取结构化数据,掌握如何使用Twisted异步网络框架来处理网络通讯的问题,可以加快我们的下载速度,也可深入接触各种中间件接口,灵活的完成各种需求 ...

  9. Spring Security 梳理 - DelegatingFilterProxy

    可能你会觉得奇怪,我们在web应用中使用Spring Security时只在web.xml文件中定义了如下这样一个Filter,为什么你会说是一系列的Filter呢?    <filter> ...

  10. layDate——初步使用

    layui系列中layDate的使用教程网址 https://www.layui.com/laydate/ 我这里简单举例: 1.引入js <script type="text/jav ...