吊打面试官系列:hashCode() 相同,equals() 就一定相等吗?

在编程的世界里,hashCode()equals() 是一对形影不离的好兄弟。它们在Java中定义于Object类中,是每个Java对象都继承的两个方法。但是,如果你认为只要两个对象的hashCode()相同,它们的equals()就一定相等,那你就大错特错了。今天,我们就来深入探讨这个问题。

1. hashCode()equals() 的定义

首先,让我们回顾一下hashCode()equals()的定义。

hashCode() 方法

hashCode() 方法用于返回对象的哈希码值。哈希码值是一个整数,通常用于在哈希表(如HashMap、HashSet等)中快速查找对象。

equals() 方法

equals() 方法用于比较两个对象是否相等。如果两个对象相等,那么它们的equals()方法应该返回true

另外:
推荐一个程序员免费学习的编程网站:我爱编程网(www.love-coding.com)
涵盖 Java几乎覆盖了所有主流技术面试题,还有市面上最全的技术精品系列教程,免费提供。
在这里插入图片描述

2. hashCode() 相同,equals() 是否一定相等?

答案是:不一定。

为什么?

根据Java规范,equals()方法必须满足以下条件:

  1. 自反性:x.equals(x) 必须返回true
  2. 对称性:x.equals(y)y.equals(x) 必须返回相同的结果。
  3. 传递性:如果 x.equals(y)y.equals(z) 都返回true,那么 x.equals(z) 也必须返回true
  4. 一致性:只要对象不变,多次调用x.equals(y)必须始终返回相同的结果。
  5. 对于任何非null值的xx.equals(null) 必须返回false

hashCode()方法必须满足以下条件:

  1. 如果两个对象相等(equals()true),那么它们的哈希码值必须相同。
  2. 如果两个对象不相等(equals()false),它们的哈希码值可以相同,也可以不同。

从这些定义中,我们可以看出hashCode()equals()之间的关系:

  • 如果两个对象相等,它们的哈希码值必须相同。
  • 但是,如果两个对象的哈希码值相同,它们并不一定相等。

3. 为什么 hashCode() 相同,equals() 不一定相等?

哈希冲突

在哈希表中,哈希码值相同的对象被称为“哈希冲突”。由于哈希函数的设计,不同的对象可能会有相同的哈希码值。这就是为什么即使两个对象的hashCode()相同,它们的equals()也不一定相等的原因。

示例

让我们来看一个简单的例子:

import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

在这个例子中,我们定义了一个Person类,它有两个属性:nameage。我们重写了equals()hashCode()方法。

假设我们有两个Person对象:

Person p1 = new Person("Alice", 30);
Person p2 = new Person("Bob", 30);

尽管p1p2age属性相同,但它们的name属性不同,所以p1.equals(p2)将返回false。但是,如果hashCode()方法只考虑age属性,那么这两个对象可能会有相同的哈希码值。

4. 如何正确实现 hashCode()equals()

规则

  1. 一致性:如果对象没有发生变化,hashCode()方法的返回值应该始终相同。
  2. 等效性:如果两个对象相等,它们的哈希码值必须相同。
  3. 效率hashCode()方法应该尽量高效。

示例

import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

在这个例子中,我们确保了equals()hashCode()方法的一致性。如果两个Person对象的nameage属性都相同,那么它们是相等的,它们的哈希码值也相同。

5. 结语

在编程中,hashCode()equals()是一对非常重要的方法。理解它们之间的关系和实现方式,对于编写高质量的代码至关重要。记住,即使两个对象的hashCode()相同,它们的equals()也不一定相等。这是由于哈希冲突的存在,以及hashCode()方法的设计原则。

希望这篇文章能帮助你更好地理解hashCode()equals(),让你在编程的道路上越走越远!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13885.html

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

相关文章

阿托伐他汀降脂疗效与安全性真实世界数据整理!

2024年9月,《中国医疗保险》杂志发布了题为《阿托伐他汀仿制药治疗高脂血症疗效与安全性的多中心回顾性队列研究》的重要研究结果。该研究由首都医科大学宣武医院牵头,联合上海交通大学医学院附属瑞金医院、吉林大学第一医院等10家国内顶尖三甲医院共同完…

深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅

​​​​​​​ 🌟个人主页:落叶 🌟当前专栏: C专栏 目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承基类成员访问⽅式的变化 继承类模板 基类和派⽣类间的转换 继承中的作⽤域 隐藏规则 成员函数的隐藏 考察继承【作⽤…

“嵌入”在大语言模型中是解决把句子转换成向量表示的技术

上一篇:《人工智能是这样理解“情绪”的》 序言:这段话要优化吗?““嵌入”是一种将句子、单词或其他语言单位转换为向量表示的技术。这个向量通常位于高维空间中,它以一种能够表达相似性的方式编码出文本的含义或上下文。嵌入层…

操作系统——内存分区管理

本章主要讨论为什么要给内存进行划分和如何划分的问题。 为了给每一个进程都分配一个大小合适的内存块 以连续存储进程的程序和数据,使得各进程可以并发执行 目录 一、内存的划分方法 1、固定分区法 2、动态分区法 3、动态分区的数据管理结构 二、分区的分配与回…

ML 系列: 第 24 节 — 离散概率分布(泊松分布)

目录 一、说明 二、固定时间间隔示例 三、固定间隔的示例 四、泊松分布的主要特征 五、示例 5.1 平均客户数的计算: 5.2 用于计算和绘制泊松分布的 Python 代码: 一、说明 泊松概率分布是一种离散概率分布,它表示在固定的时间或空间间隔内发生…

【comfyui教程】如何用 ComfyUI 修复和上色老照片?详细教程让老照片焕发新生

前言 如何用 ComfyUI 修复和上色老照片?详细教程让老照片焕发新生 老照片承载着无数回忆,可时光不饶人,随着岁月流逝,它们渐渐变得模糊、泛黄,甚至出现了褪色、裂痕。对于想要留住这份珍贵记忆的人来说,修…

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好,可正常使用。 例: 设备BMC地址:10.99.240.196 一. 给磁盘做raid 要求: 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

BUUCTF pwn2_sctf_2016 int 0x80方法

本文目的 BUUCTF的PWN的第一页的pwn2_sctf_2016的libc不适用辣,但网上一搜全是libc 然后怎么办嘞,都明摆着有个int 0x80,当然是用啊 所以水一篇 早上中午晚上好 老三样,下载程序,打开ida,拖进去 一眼好几…

如何构建一个功能强大的低代码平台网站?关键步骤与技巧全解析

随着数字化转型的加速,企业对敏捷开发和快速迭代的需求越来越迫切。低代码平台应运而生,成为连接业务需求和技术实现的重要桥梁。低代码平台不仅能够大幅降低技术门槛,还能够通过可视化界面和预配置组件简化开发流程,帮助企业快速…

Unity图形学之Shader2.0 模板测试

1.模版测试:符合条件的 通过 不符合条件的 像素 丢弃 比较公式: if((referenceValue&readMask) comparisonFunction (stencilBufferValue&readMask)) 通过像素 else 抛弃…

RK3588 快速上手

1、资料介绍 我的开发板是临滴科技的LKD3588,相关的官网上都可以找到,我这里给大家一个网盘链接 LKD3588-开发板(公开资料) https://pan.baidu.com/s/1snYcWY-S4rLMCE_3nGlHrw?pwd3588 LKD3588-开发板(保密资料&…

STM32完全学习——点亮LED灯

一、寄存器描述 首先我们知道STM32对外设的操作,是靠对寄存器的设置来完成的。因此我们想要点亮LED灯,就需要知道端口的控制寄存器,然后给寄存器设置不同的值就可以让端口来输出0或1,首先我这里使用的是GPIOA这个端口的0-8位来做…

【Python】如何使用Python-Tkinter打造炫酷动态心形动画 !保姆级教程

文章目录 教程:从零开始,逐步实现动态心形动画环境准备第一步:导入必要的模块第二步:定义画布参数第三步:定义心形生成函数第四步:实现点的散布与收缩第五步:定义曲线函数第六步:创建…

基于SSM的“家政预约管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“家政预约管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 家政预约管理系统功能结构图 系统首页界面 用户注册界面 家政…

MongoDB在现代Web开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

springboot企业信息管理系统,计算机毕业设计项目源码310,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,员工信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

【JAVA毕业设计】基于Vue和SpringBoot的周边产品销售网站

博主说明:本文项目编号 T 061 ,文末自助获取源码 \color{red}{T061,文末自助获取源码} T061,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

YOLOV8应用|排球垫球计数|附带全部数据集与源码(见文末百度云盘链接)

项目简介: 该项目旨在利用YOLOv8算法实现排球垫球动作的自动识别与计数。YOLOv8作为计算机视觉领域的先进目标检测算法,具备高精度和实时性的特点,非常适合用于体育训练和测试中的自动化计数。项目将排球垫球视频作为输入,通过YOLOv8算法检测视频中的排球及垫球动作,自动…

【工具变量】上市公司企业生产经营效率数据集(1990-2023年)

一、计算说明: 参考《数量经济技术经济研究》沈坤荣(2024)老师的研究,为了度量企业生产经营效率,选取管理费用率(manage_cost)、营运资金周转率(fund_turn)和总资产周转…

Openstack10--认证服务(Keystone)安装

在控制节点安装认证服务组件 yum -y install openstack-keystone httpd mod_wsgi 其中“openstack-keystone”是Keystone的软件包;“httpd”是阿帕奇(Apache)Web服务器的软件包名;“mod_wsgi”是使Web服务器支持WSGI的插件。 进…