代码编织梦想

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46202060/article/details/134405366

关于重写equals方法时必须重写hashcode方法的一系列问题。-爱代码爱编程

Why 日常开发中经常会遇到重写equals和hashocode的场景,以前对这些概念很模糊,只知其然,不知其所以然,现在对这些知识理论进行总结、归纳,加强理解。 What Object是所有对象的基类,它包含两个基本的方法: equals和hashcode (1)equals (2)hashcode hashcode是Java native

为什么重写equals方法必须重写hashcode方法-爱代码爱编程

equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等。为什么要这样设计嘞?原因就出在“性能” 2 字上。 使用过 HashMap 我们就知道,通过 hash 计算之后,我们就可以直接定位出某个值存储的位置了,那么试想一下,如果你现在要查询某个值是否在集合中?如果不通过 hash 方式直接定位

为什么重写equals方法必须要重写hashcode方法-爱代码爱编程

为什么重写equals方法必须要重写hashCode方法 ​ 了解这个问题之前我们得需要知道hashCode的作用。equals方法和hashCode方法都是Object类中的基础方法,用来判断两个对象是否相等。而平时我们

spring cloud 概述及项目创建-爱代码爱编程

本篇主要介绍什么是Spring Cloud,以及Spring Cloud工程的创建 目录 一、什么是微服务? 集群  分布式 微服务 二、Spring Cloud 什么是Spring Cloud Spring Cloud 版本 Spring Cloud实现方案 Spring Cloud 工程创建 创建父工程 创建子工程 一

java导出excel动态加载多sheet多复杂表头-爱代码爱编程

java导出excel动态加载多sheet多复杂表头 实体实现类sheet方法业务工具方法实现效果 实体 import com.fasterxml.jackson.annotation.JsonFo

遍历二叉树的统一迭代法-爱代码爱编程

二叉树的统一迭代法 普通迭代遍历方式无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况,前中后序的迭代法各有区别,那么如何实现统一的代码写法呢 那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。 如何标记呢?  就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法。

jar包增量更新分析-爱代码爱编程

jdk自带工具jdeps,可分析class依赖关系(依赖的其它类和jar)。 团队,可以在此工具结果的基础上再详细分析对比出增量文件; 思路如下: jdeps分别分析出旧包和新包的文件依赖关系。并对比出新增的文件列表、删

kubernetes 审计日志采集与分析最佳实践-爱代码爱编程

Kubernetes 审计日志概述 Kubernetes 在 1.7 版本中发布了审计(Audit)日志功能,审计(Audit)提供了安全相关的时序操作记录(包括时间、来源、操作结果、发起操作的用户、操作的资源以及请求/响应的详细信息等),通过审计日志,我们能够非常清晰的知道 K8S 集群到底发生了什么事情,包括但不限于: 当前/历史上集群发生了哪些变

解决 springboot 的 date、localdatetime 变成时间戳和数组的问题,创建自定义对象消息转换器-爱代码爱编程

问题描述 SpringBoot 项目,当返回前端的数据类型为 Map 的时候,在 Map 中 put() 时间对象会出现以下问题: 传递的 Date 对象会变成时间戳传递的 LocalDateTime 对象会变成数组

springboot接入knife4j接口文档-爱代码爱编程

0.介绍 1) Knife4j是什么 Knife4j是Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,有着比Swagger更为美观的UI以及功能。

命令执行漏洞(二)-爱代码爱编程

Struts2框架命令执行漏洞 环境准备:虚拟机win2003     jspstudy2016     Struts Showcase靶场环境 查看历史相关漏洞在线平台 : 乌云(WooYun.org)历史漏洞查询: https://wy.zone.ci/searchbug.php?q=Struts2 知道创宇 Seebug 漏洞平

java中为什么重写equals方法就一定要重写hashcode方法_java重写equals一定要重写hashcode-爱代码爱编程

        在Java中,当你重写equals方法时,强烈建议也重写hashCode方法,这是由于哈希相关的数据结构(例如HashMap、HashSet)等的特性。 我们需要理解equals和hashCode方法的作用:equals用于比较两个对象是否“相等”,而hashCode则用于计算对象的哈希值。 1. 如果两个对象equals,那么它们的h