博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么要重写equals()方法与hashCode()方法
阅读量:6424 次
发布时间:2019-06-23

本文共 2590 字,大约阅读时间需要 8 分钟。

在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));//false5 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     @Override21     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(Collection中很多方法涉及E.equals()的);而hashCode的重新,是方便Map
的使用,良好的自定义hashCode,会极大的提高Map的使用效率。为啥说equals重新时,一定要重写hashCode?感觉这么理解不知行不行:既然自定义类重写了equals方法,说明类设计者不希望通过内存地址来比较两个对象是否相等了。而Object的hashCode也是对象的内存地址,既然不希望通过地址比较对象,那么以内存地址作为hashCode也就没有实际使用意义了,索性将自定义对象的hashCode方法也重写了吧!

 

参考:    

转载地址:http://dygra.baihongyu.com/

你可能感兴趣的文章
es6基础0x023:Promise
查看>>
【跃迁之路】【644天】程序员高效学习方法论探索系列(实验阶段401-2018.11.17)...
查看>>
git push出现Permission denied (publickey)错误
查看>>
如何使用python抓取issues.apache.org上的bug列表
查看>>
分词,难在哪里?科普+解决方案!
查看>>
《从零构建前后分离的web项目》实战 -5分钟快速构建炒鸡规范的VUE项目骨架
查看>>
【wol】远程开机
查看>>
Blender Python API概述
查看>>
css 动画
查看>>
关于使用别人给的已安装好create-react-app的webstorm空项目
查看>>
SpringBoot非官方教程 | 第二十一篇: springboot集成JMS
查看>>
WEEX-android播放背景音乐 (使用module)
查看>>
linux下安装node npm并配置
查看>>
基于asyncio编写一个telegram爬虫机器人
查看>>
vue.js+socket.io+express+mongodb打造在线聊天室[二]
查看>>
parcel打包vue
查看>>
什么是Scrum
查看>>
nginx负载均衡的5种策略
查看>>
90%人都不知道:SVN 和 Git 的一些误解和真相
查看>>
基于Vue-Cli的非跨域请求模拟数据(Mock)快速配置更新接口的解决方案
查看>>