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

在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
这确保了相等的对象具有相等的哈希码。在实际应用中,你可能需要根据具体的对象属性选择更适合的生成哈希码的方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Techgen ict 转 qrcTechFile问题整理

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ERROR (EXTZTECH-157) : Density value need to increase monotonically . 根据提示定位到ict的以下内容: resistivity 0.231 106.5192 ... ... 1.9 81.3252 根据错误提示我…

中电金信:语言服务解决方案

​​ ​​ 点击或扫描下图二维码&#xff0c;查看更多相关内容 ​​ ​​ ​​ ​​ 01方案概述 我们以成熟的语言服务能力为核心&#xff0c;围绕出海企业的需求&#xff0c;构建覆盖企业出海全生命周期的语言服务。我们在全球31个城市设有交付中心&#xff0c;可以为出海…

MDM9205开发环境搭建与编译调试

前言 如题,这篇文章说的是高通mdm9205这颗物联网芯片,从官方资源的获取(包括文档、代码、软件工具等等)到如何编译出可运行固件的方法。 对经历了不止一次这颗芯片开发的我来说,在过程中遇到问题,除了寄希望于可能在工作日第二天凌晨得到的case回复,有一篇最新的有指导方…

Vue3中的 ref() 为何需要 .value ?

前言 本文是 Vue3 源码实战专栏的第 7 篇&#xff0c;从 0-1 实现 ref 功能函数。 官方文档 中对ref的定义&#xff0c; 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 老规矩还是从单测入手&…

Failed to restart network.service: Unit network.service not found.

执行systemctl restart network命令&#xff0c;报错Failed to restart network.service: Unit network.service not found. 执行 yum install network-scripts命令 再次执行&#xff0c;正常

计算机视觉基础(6)——光流估计

前言 本章我们来学习一下图像处理基础中的运动估计。主要内容包括运动场估计和光流估计两个部分。在运动场估计中&#xff0c;我们将学习到运动场、光流、光流和运动场的区别&#xff1b;在光流估计中&#xff0c;我们将学习到光流估计任务、孔径问题&#xff0c;以及光流估计两…

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;…

腾讯云五年服务器CVM和三年轻量应用服务器选哪个?

腾讯云3年轻量和5年云服务器CVM优惠活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选择2核4G和4核8G配置可选&#xff0c;阿腾云atengyun.com分享腾讯云3年轻量应用服务器和5年云服务器CVM优惠活动入口和配置报价&#xff…

【STM32单片机】比赛计时计分系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用OLED显示模块、矩阵按键模块、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED默认显示第1节次比赛时间、AB得分。默认是12分钟倒计时…

机器学习6:逻辑回归

假设我们有一个二元分类问题&#xff0c;有两个特征&#xff08;x1, x2&#xff09;和对应的类别标签&#xff08;y&#xff09;。给定 以下训练数据集&#xff1a; 我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函 数来将线性函数的输出转换为概率值&…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…

【2014年数据结构真题】

41. (13分&#xff09;二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 给定一棵二叉树T,采用二叉链表存储&#xff0c;结点结构如下&#xff1a; 其中叶结点的weight域保存该结点的非负权值。 设root为指向T的根结点的指针&#xff0c; 请设计求T 的WPL…

抖音电商的野心,中小商家的风口

文丨新熔财经 作者丨寒蝉鸣 反向消费的大浪潮&#xff0c;不会辜负任何一个抓住风口的平台。过去是拼多多&#xff0c;如今是唯品会。 靠着响应新时代消费者对“质价比”的需求&#xff0c;消失在大众视线许久的唯品会&#xff0c;不仅守住了电商老前辈的行业地位&#xff0…

Express基本接口开发-入门学习

前提推荐 任何一个新的知识都是从文档看起&#xff0c;因此express官方文档示例有必要去学习一遍。 推荐看&#xff1a; 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了&#xff0c;然后现在就可以去练习了 注意&#xff1a;更多示例-代…

Quarkus 替代 SpringBoot

1 概述2 SpringBoot3 Quarkus4 比较5 调查结果6 从 Spring 转换到 Quarkus7 我是 Spring 开发者&#xff0c;为什么要选Quarkus&#xff1f;8 Spring 开发者可以活用哪些现有知识&#xff1f;9 对Spring开发者有额外的好处吗&#xff1f;10 Spring开发者如何开始学习Quarkus&am…

libgdx实现雪花、下雪效果(二十三)

libgdx实现雪花、下雪效果&#xff08;二十三&#xff09; 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-xian-xue-hua package effect;import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.…

使用CXF调用WSDL(二)

简介 本篇文章主要解决了上篇文章中遗留的对象嵌套问题&#xff0c;要想全面解析无限极的对象嵌套需要使用递归去解决 上文链接&#xff1a; 使用CXF调用WSDL&#xff08;一&#xff09; 上文回顾 上文使用了单方法“ call() ”解决了List和基本类型&#xff08;含String&…

基于逐次变分模态分解(SVMD)联合小波阈值去噪

代码原理 逐次变分模态分解 (Iterative Variational Mode Decomposition, IVMD) 是一种信号分解方法&#xff0c;它可以将一个时域信号分解为若干个本征模态函数&#xff08;Intrinsic Mode Functions, IMF&#xff09;。它通过迭代寻找信号的本征模态函数和残差部分&#xff…

Kalman滤波

文章目录 一、公式推导二、扩展卡尔曼滤波 卡尔曼滤波是一种最优化递归数据处理算法。&#xff08;Optimal Recursive Data Processing Algorithm&#xff09; Kalman滤波是时域滤波&#xff0c;采用状态空间描述系统&#xff0c;运用递推形式是计算简单&#xff0c;数据存储量…

TSINGSEE视频汇聚管理与AI算法视频质量检测方案

一、建设背景 随着互联网视频技术的发展&#xff0c;视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是&#xff0c;在监管场景中&#xff0c;仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题&#xff0c;对企业的日常管理和运转存在较大的安全隐患…