前言
在学习Java基础的时候,相信大家都应该学到过覆写equals方法的时候必须覆写hashCode方法,但是为什么要这么做呢?
必备知识
1.每个类默认继承自超类Object,并继承Object类的equals方法和hashCode方法;
2. Object类的equals方法是直接对对象地址进行比较;
3.不同对象调用hashCode方法生成的hash码一般不同。
equals方法介绍
首先,我们需要了解一下这两个方法是用来做什么的。先看equals,从字面意思看,equals指的是相等,是用来比较两个对象是否相等的,例如:我们比较两个String类型的对象相等时就会用到equals方法,你可能会说,用"=="也可以比较是否相等,是的,用"=="确实可以比较,因为"=="比较的是对象的地址,两个对象地址相等,那么这两个对象当然相等了,实际上它们在内存中就是同一个对象。
但是,更多的时候我们关注的是对象逻辑上是否相等,而不会介意它们是否是内存中的同一个对象,例如下面一段代码:
@Test
public void testEquals(){
String a = new String("小诸葛");
String b = new String("小诸葛");
System.out.println(a == b);
System.out.println(a.equals(b));
}
运行结果:
false
true
a对象和b对象是两个不同的对象,但我们希望能够得到这两个对象相同的结果,因为这两个对象逻辑上是相等的(它们的内容都是"小诸葛"),使用"=="显然不能得到正确的结果,因而,我们使用equals方法比较这两个对象是否相等,String类的equals方法比较的是内容,即比较逻辑上是否相等。
通过上面的案例,我们应该知道equals方法的作用了,没错,equals方法就是比较两个对象逻辑上是否相等。
hashCode方法介绍
完equals我们再来说说hashCode方法,hashCode方法基本用于散列集合中,是用来计算hash码的,像HashMap、Set、HashTable等使用hash算法的集合中均会用到hashCode方法,我们以Set为例来讲讲hashCode方法。
Set集合是用来做什么的?Set集合是用来存储不同对象的集合,也就是说Set集合内的元素都是不同的对象,那么Set集合是怎么判断两个对象是否相等呢?并且Set集合又是怎么存储元素的呢?
实际上,Set集合是通过hashCode方法计算出对象的hash码,然后再用hash码进行计算来得出对象的存储位置的,并且Set内部结构(数组+链表)中,每个存储位置是可以存多个对象的,之所以这么设计是为了提高索引效率,也就是说对象的hash码相等时并不一定是同一个对象,所以此时需要使用equals方法来判断对象是否相等,如果相等,就是相同对象,反之就是不同的对象。
综上所述:equals方法是用来比较对象逻辑上是否相等的,hashCode方法是用来计算对象的存储位置的。
Set是怎么添加新对象的呢?首先,它会先计算出对象的hash码,然后再用hash码计算出对象的位置,然后再用equals方法逐个比较是否有和要存储的对象相等的对象,如果没有,就执行添加,反之则不执行添加。
为什么一定要覆写hashCode方法?
通过上述介绍,我们已经了解了这两个方法的作用,设想这样一个场景,我们想在Set集合中存储用户Person类信息,用来记录有多少个用户,那么,如果只覆写equals方法而没有覆写hashCode方法,用户集合中就会存在相同用户的信息,为什么呢?因为Person类没有覆写hashCode方法,那么,逻辑上相等的两个用户,他们的hash码是不相等的,因为hash码不相等,Set集合就无法判断出指定用户已存在,因而集合中就会存储相同用户的信息。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有