前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么覆写equals方法时一定要覆写hashCode方法?

为什么覆写equals方法时一定要覆写hashCode方法?

作者头像
小诸葛
发布2020-04-14 15:46:01
6310
发布2020-04-14 15:46:01
举报
文章被收录于专栏:方法论

前言

在学习Java基础的时候,相信大家都应该学到过覆写equals方法的时候必须覆写hashCode方法,但是为什么要这么做呢?

必备知识

1.每个类默认继承自超类Object,并继承Object类的equals方法和hashCode方法;

2. Object类的equals方法是直接对对象地址进行比较;

3.不同对象调用hashCode方法生成的hash码一般不同。

equals方法介绍

首先,我们需要了解一下这两个方法是用来做什么的。先看equals,从字面意思看,equals指的是相等,是用来比较两个对象是否相等的,例如:我们比较两个String类型的对象相等时就会用到equals方法,你可能会说,用"=="也可以比较是否相等,是的,用"=="确实可以比较,因为"=="比较的是对象的地址,两个对象地址相等,那么这两个对象当然相等了,实际上它们在内存中就是同一个对象。

但是,更多的时候我们关注的是对象逻辑上是否相等,而不会介意它们是否是内存中的同一个对象,例如下面一段代码:

代码语言:javascript
复制
    @Test
    public void testEquals(){
        String a = new String("小诸葛");
        String b = new String("小诸葛");
        
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }

运行结果:

代码语言:javascript
复制
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集合就无法判断出指定用户已存在,因而集合中就会存储相同用户的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小诸葛的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档