为什么重写equals方法必须重写hashcode方法

news2024/11/25 12:42:24

在Java中,重写equals()方法的同时也应该重写hashCode()方法,这是因为这两个方法在 Java 中是有关联的,而且它们一起影响着集合类的行为。

Java中的hashCode()方法用于返回对象的哈希码,而equals()方法用于比较两个对象是否相等。在集合类(如HashMap、HashSet等)中,hashCode()方法被用来确定对象在内部存储结构中的位置,以便更快地进行查找。如果两个对象在equals()方法中被认为相等,那么它们的hashCode()方法应该返回相同的值。

下面是一些原因说明为什么重写hashCode()方法是很重要的:

集合类的性能: 在使用哈希集合(如HashMap、HashSet)时,对象的hashCode()方法影响着集合的性能。如果两个相等的对象返回不同的哈希码,它们可能会被放置在不同的存储桶中,导致集合无法正确工作。

保持一致性: 根据equals()方法的规范,如果两个对象相等,它们的哈希码应该相等。这是为了确保当一个对象被修改后,它在集合中的位置不会改变,从而保持集合的一致性。

符合对象相等性原则: 如果两个对象通过equals()方法比较相等,那么它们的哈希码应该相等。这是为了保持Java对象相等性原则的一致性。

为了满足这些要求,当你重写了equals()方法时,最好也一并重写hashCode()方法。

当你只重写了equals()方法而没有重写hashCode()方法时,可能导致相等的对象拥有不同的哈希码,这会违反哈希表的基本性质。下面是一个例子:

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public 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);
    }

   //    @Override
//    public int hashCode() {
//        return Objects.hash(name, age);
//    }
 
}

public class myTest {
    public static void main(String[] args) {
        Map<Person, String> personMap = new HashMap<>();

        Person person1 = new Person("John", 25);
        Person person2 = new Person("John", 25);
        
        System.out.println(person1 == person2);   // new出来的两个对象,内存地址肯定不一样,所以返回false
        System.out.println(person1.equals(person2));  // true  return age == person.age && Objects.equals(name, person.name);

        personMap.put(person1, "Person 1");  // 向map集合中添加数据

        // 尽管 person2 与 person1 equals() 返回 true,但由于没有重写 hashCode(),它们的哈希码不同
        // 取值
        System.out.println(personMap.get(person2)); // 输出 null
        System.out.println(personMap.get(person1));  // 输出 Person 1
    }
}

结果1:
没有重写hashcode()方法
在这里插入图片描述
personMap.get(person2)时,返回的结果为null。这违反了哈希表的期望行为,即相等的对象应该有相等的哈希码。

结果2:
同时重写equals() 和 hashcode() 方法
在这里插入图片描述
此时用personMap.get(person2)取值时,结果返回Person 1
这确保了相等的对象具有相等的哈希码。在实际应用中,你可能需要根据具体的对象属性选择更适合的生成哈希码的方式。

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

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

相关文章

[文件读取]webgrind 文件读取 (CVE-2018-12909)

1.1漏洞描述 漏洞编号CVE-2018-12909漏洞类型文件读取漏洞等级⭐⭐⭐漏洞环境VULFOCUS攻击方式 1.2漏洞等级 高危 1.3影响版本 Webgrind 1.5版本 1.4漏洞复现 1.4.1.基础环境 1.4.2.前提 网站后台地址&#xff1a; 后台管理账密&#xff1a; 后台登录地址 1.5深度利用 …

【rl-agents代码学习】02——DQN算法

文章目录 Highway-env Intersectionrl-agents之DQN*Implemented variants*:*References*:Query agent for actions sequence探索策略神经网络实现小结1 Record the experienceReplaybuffercompute_bellman_residualstep_optimizerupdate_target_network小结2 exploration_polic…

spring 整合 JUnit

大家好&#xff0c;本篇博客我们通过spring来整合JUnitt单元测试框架。 在之前篇章的测试方法中&#xff0c;几乎都能看到以下的两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxx…

ppt画思路图 流程图 医学药学生画图素材

关注微信&#xff0c;回复: 素材 &#xff0c;即可领取

EtherNET转Profibus网关使用 AB PLC的配置方法

兴达易控EtherNET转Profibus网关&#xff08;XD-EPPB20&#xff09;是一款功能强大的通讯设备&#xff0c;具备Profibus从站功能。它的主要作用是将EtherNET/IP设备无缝接入到PROFIBUS网络中。通过连接到Profibus总线&#xff0c;它可以作为从站使用&#xff0c;并且通过连接到…

作为8年老测试告诉你学会这样写性能测试方案,阿里p8都直呼内行

订单处理服务的性能测试方案V1.0 一、需求背景 在设计评审之后&#xff0c;开发在不知道服务性能瓶颈&#xff0c;需要测试协助定位服务的性能瓶颈&#xff0c;需要测试模拟一定时间之内设计并发用户同时向系统发出请求&#xff0c;检测出系统的响应能力&#xff0c;包括响应…

企业数字化建设之——老板关注的IT指标有哪些 ?

投资回报ROI | 商业价值 | 系统可用性 | 业务的参与程度 | 技术债务指数 降本&#xff0c;增效是IT部门工作的永恒话题 &#xff0c;降低成本 &#xff0c;增加效益 &#xff0c;降本增效的工作方向&#xff1a; 1 年初KPI目标、目标完成情况、关键证据、公司主线工作…

腾讯云2核4G和4核8G服务器配置5年租用价格表

腾讯云服务器网整理五年云服务器活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频…

Java的XWPFTemplate word生成列表

Java的XWPFTemplate工具类导出word.docx的使用_xwpftemplate 语法_youmdt的博客-CSDN博客 如果是表格的列表参考上面这篇文章即可&#xff0c;比较复杂的列表遍历暂时还没找到方法&#xff0c;只能手动创建表格了 上面是模板&#xff0c;非常简单&#xff0c;以为我们是要自己创…

SELF-AUGMENTED MULTI-MODAL FEATURE EMBEDDING

two embeddings f o r g _{org} org​ and f a u g _{aug} aug​ are combined using a gating mechanism 作者未提供代码

修改Conda虚拟环境默认位置失败——解决方案

修改虚拟环境默认安装位置依然❌ 偶然遇到conda创建虚拟环境创建失败的问题&#xff0c;按照教程修改.condarc文件中 envs_dirs:- E:\miniconda3\envs依然无法更改虚拟环境默认安装位置。 解决方案 找到想更改的虚拟环境文件位置&#xff0c;检查确认是否有写入权限&#…

C++ builder 常见问题汇总

1、CB静态编译设置 2、CB10.3设置经典编译器&#xff08;用于解决10.3弹出代码提示慢&#xff09; 3、CBuilder生成Release版本 &#xff1a; project->Options->CCompiler->Build Configuration 选择 Release project->Options->CLinker中取消Use dynamic RTL…

upload-labs关卡5(点和空格绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第五关通关思路1.看源代码2.点和空格绕过3、验证上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&#xff0…

MES系统如何改进生产管理?

伴随机械制造业行业竞争逐渐加剧&#xff0c;越来越多企业意识到MES系统的重要性&#xff0c;慢慢积极主动把握和实施MES系统。可是纵观绝大部分企业或者MES生产商&#xff0c;对MES的掌握依然存在比较大的分歧。 有一些人说MES系统是企业信息化构建的中枢神经&#xff0c;也有…

HTML转PDF模板

一、准备pom依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId&g…

LockBit3.0的字符串解密方法

LockBit 与大多数勒索黑客团体一样以勒索软件即服务 (RaaS) 模式运行,该组织于 2019 年 9 月首次被观察到,此后发展为了今年最主要的勒索软件团伙,甚至超过了Conti、Hive等其他知名团体。据泄露数据站点的数据统计表明,LockBit占2022年第一季度所有与勒索软件相关的泄露事件…

基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码

基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于自私羊群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于自私羊群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于闪电搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于闪电搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【开源】基于JAVA的超市商品管理系统

目录 一、摘要1.1 简介1.2 项目详细录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品…

使用清华智谱ChatGLM2大模型搭建本地私有知识库

首先放上该方案项目的git地址&#xff1a;https://github.com/chatchat-space/Langchain-Chatchat 以下是我的搭建和踩坑经验记录 一、环境准备 1、python安装 在环境中安装python&#xff0c;我安装的是3.9版本的python&#xff0c;官方要求的是Python 3.8 - 3.10 版本。不知…