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

news2024/12/23 15:21:38

回答重点

在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.coloradmin.cn/o/2264288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

basic_ios及其衍生库(附 GCC libstdc++源代码)

basic_ios及其衍生库(附 GCC libstdc源代码) 我们由这张图展开我们的讨论 对于Date对象&#xff0c;只有实现了<<重载到输出流才可以插入到stringstream ss中 现在我有疑问stringstream是怎么做到既能输出又能输入的&#xff1f; 而且为什么stringstream对象能传给ostre…

【开源库 | minizip】Linux(Ubuntu18.04)下,minizip的编译、交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-20 …

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题&#xff0c;需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令&#xff0c;用于维护 go.mod 文件…

java: 无效的目标发行版: xx

java: 无效的目标发行版: xx 背景java: 无效的目标发行版: xx 在 Intellij 的修复 背景 这里单独针对Intellij开发工具对 “java: 无效的目标发行版: xx”错误的修复。 java: 无效的目标发行版: xx 在 Intellij 的修复 同一台电脑使用多个JDK的时候容易出现在运行程序时容易…

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…

leetcode-80.删除有序数组的重复项II-day12

总结&#xff1a;不必过于死磕一道题目&#xff0c;二十分钟没做出来就可参考题解

Docker 入门:如何使用 Docker 容器化 AI 项目(一)

引言 在人工智能&#xff08;AI&#xff09;项目的开发和部署过程中&#xff0c;环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码&#xff0c;确保每个人使用的环境一致&#xff0c;才能避免 “在我的机器上可以运行”的尴尬问题。…

EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令 一、概述 Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作: EdgeX Foundry中的其他微服务(例如,本地边缘分析或规则引擎微服务)EdgeX Foundry与同一系统上可能存在的其他应用程序…

Keil5 STM32库函数的工程

库函数来间接的操作寄存器 条件编译&#xff0c;如果你定义了USE_STDPERIPH_DRIVER &#xff08;使用标准外设驱动&#xff09;这个字符串&#xff0c;stm32f10x_conf.h才有效

Vue2五、自定义指令,全局局部注册、指令的值 ,插槽--默认插槽,具名插槽 ( 作用域插槽)

一、自定义指令 使用步骤 1. 注册 (全局注册 或 局部注册) &#xff0c;在 inserted 钩子函数中&#xff0c;配置指令dom逻辑 2. 标签上 v-指令名 使用 1、自定义指令&#xff08;全局&#xff09; Vue.directive("指令名"&#xff0c;{ 指令的配置项 insert…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

MySQL基础笔记(三)

在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助&#xff0c;请多多点赞、评论、收藏&#xff0c;你们的反馈是我更新最大的动力&#xff01; 创建和管理表 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数…

使用qemu搭建armv7嵌入式开发环境

目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…

数据思维的哲学思考

引言 天地合而万物生&#xff0c;阴阳接而变化起。 《荀子礼论》 数据思维的哲学基础源于唯物主义哲学。在马克思的唯物主义思想中&#xff0c;世界是物质的&#xff0c;物质是运动的&#xff0c;运动是有规律的&#xff0c;规律是客观的。 数据思维的哲学基础就是&#xff…

Dijkstra(迪杰斯特拉)最短路径算法可视化演示

Dijkstra(迪杰斯特拉)算法&#xff0c;是一种解决带权图中单源最短路径的经典算法。它由荷兰计算机科学家 Edsger Dijkstra 于1956年提出。在现实生活中&#xff0c;这个算法被广泛应用于导航系统、网络路由等场景。 比如在地图导航中&#xff0c;城市可以看作图中的节点&…

利用深度纹理实现全局雾效

1、为什么要实现屏幕后处理效果的全局雾效 既然Unity中已经提供了全局雾效&#xff0c;那为什么还要自己来实现呢&#xff1f;主要是因为Unity自带的全局雾效有以下几个缺点&#xff1a; 需要为每个自定义Shader按规则书写雾效处理代码自带的全局雾效无法实现一些自定义效果&…

解决“SVN无法上传或下载*.so、*.a等二进制文件“问题

今天&#xff0c;在使用Subversion提交代码到服务器时&#xff0c;发现无法提交*.a、*.so等二进制文件&#xff0c;右击这些文件&#xff0c;发现其属性为ignores。     问题原因&#xff1a;SVN的配置文件里&#xff0c;屏蔽了*.a、*.so文件的上传与下载&#xff0c;并把这些…

Linux下学 〖MySQL 〗表的属性之约束条件(下)(自增长auto_increament、唯一键unique key、外键foreign key)

绪论​ 每日激励&#xff1a;“不是看到希望才坚持&#xff0c;而是坚持了才有希望。—Jack” 绪论​&#xff1a; 本章是约束的下半篇&#xff0c;它将带你认识到一些在字段中非常常用的约束条件&#xff0c;自增长AUTO_CREMENT、唯一键UNIQUE KEY 和 外键FOREIGN KEY这三个。…

观察者模式(sigslot in C++)

大家&#xff0c;我是东风&#xff0c;今天抽点时间整理一下我很久前关注的一个不错的库&#xff0c;可以支持我们在使用标准C的时候使用信号槽机制进行观察者模式设计&#xff0c;sigslot 官网&#xff1a; http://sigslot.sourceforge.net/ 本文较为详尽探讨了一种观察者模…

内置函数.

日期函数 current_date/time() 日期/时间 获得年月日&#xff1a; 获得时分秒&#xff1a; 获得时间戳&#xff1a;日期时间 now()函数 体会date(datetime)的用法&#xff1a;只显示日期 在日期的基础上加日期&#xff1a;按照日历自动计算 关键字为 intervalinterval 后的数值…