为什么重写equals必须重写hoshCode的基础分析
为什么重写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的基础分析的更多相关文章
- 为什么重写equals还要重写hashcode??
equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...
- 为什么重写equals必须重写hashCode
目录 equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上 ...
- JAVA 重写equals和重写hashCode
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” 首先你需要了解: hashCode()的作用是获取哈希码(散列码) 它实 ...
- 【Java基础】重写equals需要重写hashcode
Object里的equals用来比较两个对象的相等性,一般情况下,当重写这个方法时,通常有必要也重写hashcode,以维护hashcode方法的常规协定,或者说这是JDK的规范,该协定声明相等对象必 ...
- 为什么重写equals还要重写hashcode
参考回答: HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两 ...
- 谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法
HashSet的存储原理: 1.将要传入的数据根据系统的hash算法得到一个hash值: 2.根据hash值可以得出该数据在hash表中的位置: 3.判断该位置上是否有值,没有值则把数据插入进来:如果 ...
- 关于重写equals同时重写hashcode
1.Object中equals方法和hashcode public boolean equals(Object obj) { return (this == obj); } public native ...
- 为什么重写equals()就要重写hashcode()
阿里巴巴开发规范 只要重写 equals,就必须重写 hashCode 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方 ...
- 为什么重写equals()必须重写hashCode()
主要原因是因为hashCode是用对象的内部地址转换成一个整数的,而equals比较得是两个对象,或者是两个对象的内容 如果你重写了equals,而保留hashCode的实现不变,那么很可能两个对象明 ...
随机推荐
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
- WPS删除多余空白页
WPS删除多余空白页 在实际工作中,我们在操作WPS文字的时候常常会遇到一种问题,就是当在文字占满整页的时候,文档常常会多出一页空白页的现象.如图1 图 1 对于WPS文字怎么删除空白页这个问题, ...
- windows如何利用计划任务自动关机?
第一步打开控制面板,然后选择计划任务,打开它 选择创建基本任务 输入任务名称,描述,选择下一步 根据需要选择,我这里选择的是每天,然后选择下一步 选择任务开始时间,然后选择下一步 选择启动程序,然后选 ...
- springboot 获取Resource目录下的文件
如图,获取user.png: 代码实现: //文件路径,此处static前不能加/,否则解析不到try { //此处的static前不能加/!!! file = ResourceUtils.getFi ...
- jQuery九大选择器和jQuery对ajax的支持
一.jQuery九大选择器 1)基本选择器: <body> <div id="div1ID">div1</div> <div id=&qu ...
- sort,uniq,wc,tr
sort (选项)(参数) sort是用来排序数据的. 以下面这个文本为例 [root@bogon ~]# cat a 123 4567 88 abc aaa AAA jk 777 777 ...
- SpringBoot自定义异常,优雅解决业务逻辑中的错误
概要 你是不是在为业务逻辑中出现的异常弄的焦头烂额,常常在后台报错,前端却无法提示错误内容,导致用户体验极差?比如下单失败,前端只能提示下单失败,但是却不知道为什么失败,是库存不足,还是余额不足,亦或 ...
- Docker5-docker私库的搭建及常用方法-harbor-registry方式
一.简介 1.官方已经提供registry镜像为什么还需要用harbor 1)registry缺少镜像清理机制,可以push但是不能删除,耗费空间 2)registry缺乏相应的扩展机制 3)harb ...
- java第1天:简介,入门程序,变量,常量
1 java语言简介 美国的SUN公司开发的静态面向对象的编程语言,后来被甲骨文公司收购,现在也是全球范围内最受欢迎的编程语言. *** 2 计算机进制的相互转换 进制 英文代号 2进制 bin 8进 ...
- Spring Boot 2.X(二):集成 MyBatis 数据层开发
MyBatis 简介 概述 MyBatis 是一款优秀的持久层框架,支持定制化 SQL.存储过程以及高级映射.它采用面向对象编程的方式对数据库进行 CRUD 的操作,使程序中对关系数据库的操作更方便简 ...