首页 > 编程语言 >java基础 之 重写equals时为什么要重写hashCode

java基础 之 重写equals时为什么要重写hashCode

时间:2024-08-05 16:00:03浏览次数:19  
标签:java 对象 重写 equals hashCode 哈希 方法

文章目录

前言

了解equals戳这里→java基础 之 equals和==的区别

请记住这句话:两个对象相同,哈希码一定相同。哈希码相同,两个对象不一定相同。

回答

  • 只重写equals()方法,不重写hashCode()方法:
    存在A.equals(B)为true,但是hashCode不同,在使用散列集合进行存储的时候因为hashCode不同而存储在不同的位置,造成了数据重复;
  • 只重写了hashCode()方法,不重写equals()方法:
    当发生哈希冲突时,即使两个对象相等,但是因为内存地址不同,会将数据再次存储,造成数据重复

了解哈希

为了让对象在集合中能够更高效地进行查找和比较,我们通常需要重写对象的equals()和hashCode()方法。其中,equals()方法用于比较两个对象是否相等,而hashCode()方法则用于返回对象哈希值,供集合类使用。

  • 了解哈希表、哈希码、哈希函数的关系

在这里插入图片描述

如上图,我们需要存储一批对象,要求:不可以重复,且可以随时获取
1、通过哈希码(hashCode)来和数组长度取余,得到数组要存放的位置
2、会出现哈希冲突,如10和40,42和92,我们是上边采用的是链式寻址法
3、出现哈希冲突后,需要使用equals来判断数值是否相等,如果相等,数据不再存入,不相等,需要采取一些措施来解决哈希冲突

hashCode()

  • 定义在顶层的父类Object中,子类可以进行重写
    在这里插入图片描述

  • 是一个native方法,如果未进行重写,将内存地址转换为int数值进行返回

  • 使用hashCode()方法获取到的int数值就是哈希码(散列码,如上图的10,99,89…)。哈希码的作用是确定对象在哈希表中的位置

  • 哈希码的计算方式应该尽量均匀分布,这样可以提高哈希表的性能。

  • 哈希码的计算过程中,应该避免使用可能会发生溢出的操作。 建议使用自动生成的hashCode()方法,例如Eclipse和IntelliJ IDEA都支持自动生成hashCode()和equals()方法的功能。

至于什么是哈希冲突,怎么解决,推荐大家一篇文章 戳这里→【基础知识】什么是哈希冲突?

总结

  • 重写了equals和hashCode方法的对象,在散列集合中存储时能保证数据的唯一性:

    只重写equals方法,hashCode返回的是内存地址的int数值,会导致两个相等的对象存储在不同的位置,导致数据重复。
    只重写hashCode方法,equals是使用的Object的方法,比较的是内存地址,会被认为是两个不同的数据,再次存储,导致数据重复

  • 重写后:

    1、hasCode()方法用来在最快时间内判断两个对象是否相等并定位索引位置。
    2、可能会出现误差,这时候用equals()方法来判断两个对象是否绝对相等。
    3、hashCode()用来保证性能 equals()用来保证可靠

标签:java,对象,重写,equals,hashCode,哈希,方法
From: https://blog.csdn.net/oneouto/article/details/140914908

相关文章

  • Java编译和运行的命令
    在Java中,编译和运行Java程序主要使用两个命令:javac和java。这两个命令是JDK(JavaDevelopmentKit)的一部分,分别用于编译Java源代码(.java文件)和运行编译后的Java字节码(.class文件)。编译Java程序编译Java程序时,你使用javac命令。这个命令会读取你的Java源代码文件(.java文件),并编译......
  • 【Java基础知识4】反射
    一、反射机制Java反射机制是指在程序的运行过程中,对于任意一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制二、反射的核心内容反射的核心内容是JVM在运行时动态......
  • 【Java基础知识3】泛型
    一、泛型的意义泛型的本质是将类型参数化,从而达到代码复用。即:在不创建新的类型下,通过泛型指定不同类型来控制形参具体类型,简单来讲就是,当我们不知道用什么数据类型接收数据的情况下,可以使用泛型来接收。代码示例:未使用泛型情况下:privatestaticintadd(inta,intb){......
  • 【Java基础知识5】异常
    一、什么是异常?正常程序所不能处理或没有处理的不正常行为称为异常。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。二、异常的层次结构三、异常的分类1.Throwable异常体系的顶层类,其派生出两个重要的子类, Error 和......
  • java面对对象基础
    1.对象的内存布局类实例化为对象:类实例化为对象的语句一定要加括号,否则编译不通过//类名生成对象名=new类名()//类名生成对象名=new类名()ToolMytool=newTool();classTool{ publicbooleanoddOreven(intnum){ if(num%2!=0){ returntrue; }else{ retur......
  • Java基础语法
    关键字和保留字在Java编程语言中,关键字和保留字是语言的基本组成部分。它们有特定的含义并在Java程序中扮演着重要的角色。理解这些关键字和保留字对于编写有效的Java代码至关重要。1.关键字(Keywords)关键字是Java语言中具有特殊含义的词,它们在编译器中被预定义并用于执行特定......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......
  • Java基于XXLJOB的定时任务实现阶梯式通知方式
    数据库表设计CREATETABLE`tx_order_push_info`(`order_no`varchar(64)DEFAULTNULLCOMMENT'交易单号',`order_id`decimal(11,0)DEFAULTNULLCOMMENT'交易单Id',`push_status`decimal(2,0)DEFAULTNULLCOMMENT'推送状态',`push_count......
  • Java RMI技术详解与案例分析
    JavaRMI(RemoteMethodInvocation)是一种允许Java虚拟机之间进行通信和交互的技术。它使得远程Java对象能够像本地对象一样被访问和操作,从而简化了分布式应用程序的开发。一些应用依然会使用RMI来实现通信和交互,今天的内容我们来聊聊RMI的那些事儿。一、先来了解一下概念RMI......