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

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

作者头像
小诸葛
发布于 2020-04-14 07:46:01
发布于 2020-04-14 07:46:01
70000
代码可运行
举报
文章被收录于专栏:方法论方法论
运行总次数:0
代码可运行

前言

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

必备知识

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

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

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

equals方法介绍

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

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

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

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:重写 equals 时为什么一定要重写 hashCode?
equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等。为什么要这样设计嘞?原因就出在“性能” 2 字上。​
磊哥
2021/12/05
20K0
面试官:重写 equals 时为什么一定要重写 hashCode?
Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址,如Hashtable、hashMap中。
全栈程序员站长
2021/04/13
2.3K0
Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
面试题:重写equals方法为什么通常会重写hashcode方法?
最近在面试的时候,当问完了HashMap的数据结构之后,通常会再多问一个问题,就是:重写equals方法时通常为什么也要重写一下hashcode方法?
程序新视界
2021/03/22
6930
JAVA中重写equals()方法为什么要重写hashcode()方法说明
重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个 hashCode()值,那么就无法重新取得该对象了。所以,如果你的hashCode()方法依赖于对象中易变的数据,那用户就要小心了,因为此数据发生变化时,hashCode()就会产生一个不同的hash码,相当于产生了一个不同的“键”。        Object的hashCode()方法,返回的是当前对象的内存地址。下次如果我们需要取一个一样的“键”对应的键值对的时候,我们就无法得到一样的hashCode值了。因为我们后来创建的“键”对象已经不是存入HashMap中的那个内存地址的对象了。        我们看一个简单的例子,就能更加清楚的理解上面的意思。假定我们写了一个类:Person (人),我们判断一个对象“人”是否指向同一个人,只要知道这个人的身份证号一直就可以了。        先来个没有重写Code类的hashcode()的例子吧,看看是什么效果:
bear_fish
2018/09/20
1.1K0
JAVA中重写equals()方法为什么要重写hashcode()方法说明
java中hashcode与equals详解(集合中的用法)
一:Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法
yesr
2019/03/14
7280
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
所以在涉及到hashcode的容器中(比如HashSet),判断自己是否持有该对象时,会先检查hashCode是否相等,如果hashCode不相等,就会直接认为不相等,并存入容器中,不会再调用equals进行比较。
人不走空
2024/02/20
1.3K0
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
Java hashCode() 方法深入理解
Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色。在一些类中覆写这两个方法以完成某些重要功能。本文描述了为什么要用hashCode(), 如何使用,以及其他的一些扩展。阅读本文需要有基本的hash算法知识以及基本的Java集合知识,本文属于菜鸟入门级讲解,大神读至此请点击右上角的X,以免浪费您的时间^_^。
哲洛不闹
2018/09/18
1.5K0
Java hashCode() 方法深入理解
Java基础提升篇:equals()与hashCode()方法详解
概述 java.lang.Object类中有两个非常重要的方法: 1public boolean equals(Object obj) 2public int hashCode() 3 Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: 1public boolean equals(Object obj)
好好学java
2018/07/02
4110
在根类Object中,实现了equals()和hashCode()这两个方法
在根类Object中,实现了equals()和hashCode()这两个方法   equals()是对两个对象的地址值进行的比较(即比较引用是否相同),用==实现。   hashCode():计算出对象实例的哈希码。根类Object的hashCode()方法的计算依赖于对象实例的内存地址,即内存地址由哈希函数生成一个int值,故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如Hashtable。
用户7365393
2021/10/07
5700
【Java提高十二】hashCode()equals()
hashCode的作用 要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。在讲解数组时,我们提到数组是java中效率最高的数据结构,但是“最高”是有前提的。第一我们需要知道所查询数据的所在位置。第二:如果我们进行迭代查找时,数据量一定要小,对于大数据量而言一般推荐集合。 在Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元
Java帮帮
2018/03/15
7830
【Java提高十二】hashCode()equals()
equals() ? ==? hashCode()? 今天就把你们都认识清楚
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),基础数据类型比较的是他们的值。
Java宝典
2021/04/22
4520
hashCode和equals方法的作用
hashCode()方法用于给对象返回hash code值,equals()方法用 于判断其他对象与该对象是否相等。为什么需要这 两个方法呢?我们知道HashSet中是不允许添加重复元素的,那么当调用
Breeze.
2022/04/23
5970
一文搞懂==、equals和hashCode=的区别
面试的时候,经常会被问到==和equals()的区别是什么?以及我们也知道重写equals()时候必须重新hashCode()。这是为什么?既然有了hashCode()方法了,JDK又为什么要提供equals()方法呢?如果在重写equals()时候没有重写hashCode(),在使用HashMap或HashSet的时候可能会出现什么情况?
凯哥Java
2022/11/12
7230
一文搞懂==、equals和hashCode=的区别
Java基础不简单,谈谈hashCode()和equals()之间的联系
其实很早我就注意到阿里巴巴Java开发规范有一句话:只要重写 equals,就必须重写 hashCode。
java技术爱好者
2021/07/12
3410
Java基础不简单,谈谈hashCode()和equals()之间的联系
HashSet集合中hashCode及equals方法详解
首先我们熟知HashSet集合中元素存储的特点: 1)不允许元素重复; 2)不会记录元素添加的先后顺序; 3)HashSet中比较两个对象是否相同,要使用equals()方法,不能使用 ==; 4)底层依然使用哈希表(散列)算法,其本质就是数组形式,采用此算法就为提高查询的效率; 5)插入速度也比较快,但适合于少量元素插入操作;一旦所存储元素个数满足(size * loadFoctor > size),哈希表就要扩容,此时操作速度极慢,性能就会降低! 由于HashSet集合中的元
似水的流年
2018/01/18
6290
面试必问hashCode和equals
hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等。这两方法来源于:java.lang.Object
田维常
2019/08/28
3860
面试必问hashCode和equals
Java 中的 ==, equals 与 hashCode 的区别与联系
这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。   而通过 new 来产生一个对象,并将这个对象和str1进行绑定:
heasy3
2020/08/03
1.5K0
必须同时重写hashcode和equals方法的原因
在不重写这两个方法时,hashcode是内存地址计算出的值,equals是用==来判断是否相同,也就是根据内存地址判断是不是相同对象。
heasy3
2020/08/01
6440
java hashCode是什么?有什么作用?
hashCode() 是一个Java中的方法,它返回对象的哈希码(hash code)。hashCode是由对象根据其特征属性计算得出的一个整数值。它用于快速识别对象并在哈希表等数据结构中进行高效的存储和检索。
高久峰
2023/07/13
1.1K0
equals 和 hashCode 到底有什么联系?一文告诉你!
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。
Java技术栈
2018/07/30
6730
equals 和 hashCode 到底有什么联系?一文告诉你!
推荐阅读
相关推荐
面试官:重写 equals 时为什么一定要重写 hashCode?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文