【Java基础面试题029】Java中的hashCode和equals方法之间有什么关系?

news/2024/12/24 2:41:02 标签: java, 开发语言

回答重点

在Java中,hashCode()和equals方法的关系主要体现在集合类(如HashMap、HashSet)中。

他俩决定了对象的逻辑相等性哈希存储方式

equals()方法:

  • 用于判断两个对象是否相等,默认实现是使用==比较对象的内存地址,但可以在类中重写equals()来定义自己的相等逻辑

hashCode()方法:

  • 返回对象的哈希值,主要用于基于哈希的集合(如HashMap、HashSet)。同一个对象每次调用hashCode()必须返回相同的值,且内容相等的对象必须有相同的哈希值


两者的关系

在Java 中,hashCode 方法和equals方法之间有一个“合约”

  • 如果两个对象根据equals方法被认为是相等的,那么它们必须具有相同的哈希码。
  • 如果两个对象具有相同的哈希码,它们并不一定相等,但会被放在同一个哈希桶中。(哈希桶就是HashMap底层的数组)

注意:如果违背上述关系会导致在基于哈希的集合中出现错误行为。例如,HashMap可能无法正确存储和查找元素

扩展知识

为什么要重写hashCode()和equals()

因为在使用HashMap、HashSet等集合时,这些集合内部依赖hashCode()和equals{)方法来确定元素的存储位置。如果没有正确地重写这两个方法,集合可能无法正确判断对象的相等性,导致重复存储、查找失败等问题。

【Java基础面试题028】Java中的hashCode和equals方法,与==操作符有什么区别?-CSDN博客

重写equals()的基本规则

自反性:对于任何非空引用值×,x.equals(x)必须返回true。
对称性:对于任何非空引用值×和y,如果x.equals(y)返回true,则y.equals(x)也必须返回true。
传递性:对于任何非空引用值×、y 和z,如果x.equals(y)返回true 且y.equals(z)返回true,则x.equals(z)也必须返回true。
一致性:对于任何非空引l用值×和y,只要对象在比较中没有被修改,多次调用x.equals(y)应返回相同的结果。
对于任何非空引|用值×,x.equals(null)必须返回false。

重写hashCode()的基本规则

  • 在相同的应用程序执行过程中,对于同一个对象多次调用hashCode()必须返回相同的值
  • 如果两个对象根据equals()方法相等,则hashCode()值必须相等
  • 但是如果两个equals()不相等,它们的hashCode()值不必相同,但不同的hashCode()值可以提高哈希表的性能


http://www.niftyadmin.cn/n/5797232.html

相关文章

文章发稿平台哪个好用?哪个类型的媒体平台比较好过稿?

在做软文推广的过程中,被拒稿是个常见但又让人头疼的问题。尤其在推广节奏比较紧张的时候,拒稿会导致整个进度被持续拖延,在企业公关、新品推广等环节中会产生较为明显的负面影响。 文章发稿平台哪个好用?哪个类型的文章发稿平台比…

HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别

在智能手机、平板和其他智能设备日益智能化的今天,视觉识别技术成为提升用户体验和智能交互的重要手段。HarmonyOS NEXT通过基础视觉服务(HMS Core Vision)提供了一套强大的视觉识别功能,其中多目标识别作为其关键技术之一&#x…

sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR

本文来自天工AI --------- 命令用于安装CMake的脚本,其中--skip-license参数表示跳过许可协议的显示,--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量,应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…

git推送本地仓库到远程(Gitee)

目录 一、注册创建库 二、创建仓库 三、推送本地仓库到远程 1.修改本地仓库用户名和邮箱 2.本地库关联远程仓库 3.拉取远程仓库的文件 4.推送本地库的文件 5.查看远程仓库 四、远程分支查看 1.查看远程分支 2.修改test.txt文件 一、注册创建库 Gitee官网&#xff1…

SSH用户认证

SSH用户认证最基本的两种方式是密码认证和密钥认证。密码认证是将自己的用户名和密码发送给服务器进行认证,这种方式比较简单,且每次登录都需要输入用户名和密码。密钥认证使用公钥私钥对进行身份验证,实现安全的免密登录,是一种广…

《开启微服务之旅:Spring Boot Web开发举例》(二)

Springboot开发企业信息管理系统 引入资源 1.创建项目引入页面原型 2.引入maven的依赖和starters <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><d…

React 底部加载组件(基于antd)

底部加载组件的意义在于提供一种流畅的用户体验&#xff0c;以便在用户滚动到页面底部时自动加载更多内容。这样可以让用户无需离开当前页面&#xff0c;就能够无缝地浏览更多的内容.通过底部加载组件&#xff0c;可以分批加载页面内容&#xff0c;减少一次性加载大量数据对页面…

Java重要面试名词整理(一):MySQLJVMTomcat

文章目录 MySQL篇联合索引最左前缀法则索引下推并发事务处理带来的问题事务隔离级别Read Uncommitted&#xff08;读取未提交内容&#xff09;Read Committed&#xff08;读取提交内容 RC&#xff09;Repeatable Read&#xff08;可重读 RR&#xff09;Serializable&#xff08…