当前位置: 首页 > news >正文

为什么要重写equals()方法与hashCode()方法

在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

  • 对于值对象,==比较的是两个对象的值
  • 对于引用对象,比较的是两个对象的地址

Object 默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。

1     public boolean equals(Object obj) {
2         return (this == obj);
3     }
1     public static void main(String[] args) {
2         Object c=new Object();
3         Object d=new Object();
4         System.out.println(c.equals(d));//false
5 
6     }

这个比较下,结果是false,也就是这两个对象不一样,但是有些业务,我们需要证明一个类的下面的实例对象时相等的,这时候我们就必须重写equlas方法了。

 

如下代码,我们新建一个对象Student,并重写equals与hashCode方法

 1 public class Student {
 2 
 3     private int no;
 4 
 5     private String name;
 6 
 7 
 8     @Override
 9     public boolean equals(Object o) {
10         if (this == o) return true;
11         if (o == null || getClass() != o.getClass()) return false;
12 
13         Student student = (Student) o;
14 
15         if (no != student.no) return false;
16         return !(name != null ? !name.equals(student.name) : student.name != null);
17 
18     }
19 
20     @Override
21     public int hashCode() {
22         int result = no;
23         result = 31 * result + (name != null ? name.hashCode() : 0);
24         return result;
25     }
26 
27     public int getNo() {
28         return no;
29     }
30 
31     public void setNo(int no) {
32         this.no = no;
33     }
34 
35     public String getName() {
36         return name;
37     }
38 
39     public void setName(String name) {
40         this.name = name;
41     }
42 }
1         Student a=new Student();
2         Student b=new Student();
3         System.out.println(a.equals(b));//ture    

 

此时可以看出a、b对象相等.

 

hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。

 

一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。

所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

 

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;

a: Map、Set等集合类型存放的对象必须是唯一的;

b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。

2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。

 

 

 

个人感觉equals重写,是站在使用的角度上考虑的:类设计者不希望通过内存地址来比较两个对象是否相等,重写这个equals方法,能够方便的使用Collection<E>操作自定义对象E(Collection中很多方法涉及E.equals()的);而hashCode的重新,是方便Map<K,V>的使用,良好的自定义hashCode,会极大的提高Map的使用效率。

为啥说equals重新时,一定要重写hashCode?感觉这么理解不知行不行:既然自定义类重写了equals方法,说明类设计者不希望通过内存地址来比较两个对象是否相等了。而Object的hashCode也是对象的内存地址,既然不希望通过地址比较对象,那么以内存地址作为hashCode也就没有实际使用意义了,索性将自定义对象的hashCode方法也重写了吧!

 

参考: hashCode的作用   重写equals方法为什么要重写hashCode方法

相关文章:

  • 【烈日炎炎战后端】计算机网络(4.2万字)
  • linux中c语言errno的使用
  • 【烈日炎炎战后端】操作系统(1.1万字)
  • for while (list each)的用法
  • 【烈日炎炎战后端】设计模式(1.1万字)
  • 【烈日炎炎战后端】 数据结构(0.7万字)
  • JavaScript学习总结——原型
  • 2的幂在约瑟夫环问题的应用
  • 【烈日炎炎战后端】MySQL理论(2.8万字)
  • Mysql5.6主从复制
  • 【烈日炎炎战后端】MySQL编程(3.6万字)
  • 【Mongodb】Master-Slave 复制
  • 解决前端文件修改后浏览器页面未更新的问题
  • 【烈日炎炎战后端】Redis(6.1万字)
  • UIScrollView视差模糊效果
  • create-react-app做的留言板
  • exif信息对照
  • express如何解决request entity too large问题
  • Rancher-k8s加速安装文档
  • Redis在Web项目中的应用与实践
  • Unix命令
  • windows-nginx-https-本地配置
  • zookeeper系列(七)实战分布式命名服务
  • 从输入URL到页面加载发生了什么
  • 反思总结然后整装待发
  • 力扣(LeetCode)357
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 找一份好的前端工作,起点很重要
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​queue --- 一个同步的队列类​
  • ​Spring Boot 分片上传文件
  • ​人工智能书单(数学基础篇)
  • ​用户画像从0到100的构建思路
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.ajax,axios,fetch三种ajax请求的区别
  • (a /b)*c的值
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (笔试题)合法字符串
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)jQuery 基础
  • .net core控制台应用程序初识
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .netcore 获取appsettings
  • ;号自动换行
  • @Import注解详解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [100天算法】-实现 strStr()(day 52)
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——