【面试题精讲】为什么重写equals时必须重写hashCode方法?

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址

面试题手册

系列文章地址


  • equals() 方法用于比较两个对象是否相等,而 hashCode() 方法用于获取对象的哈希码。
  • 在 Java 中,如果两个对象通过 equals() 方法判断为相等,则它们的 hashCode() 方法必须返回相同的值。这是因为在使用哈希表(如 HashMap、HashSet)等数据结构时,会先根据对象的哈希码确定存储位置,然后再使用 equals() 方法进行比较来确保唯一性。
  • 如果重写了 equals() 方法但没有重写 hashCode() 方法,那么可能会导致以下问题:
    • 当将对象放入哈希表中时,由于 hashCode() 返回的不是相同的值,哈希表无法正确定位到该对象所在的位置,从而无法正常操作该对象。
    • 当使用哈希集合(如 HashSet)时,由于 hashCode() 返回的不是相同的值,哈希集合无法正确判断两个对象是否相等,从而可能导致重复元素的存在。
  • 因此,在重写 equals() 方法时,必须同时重写 hashCode() 方法,以保证对象的相等性和哈希码的一致性。
  • 下面是一个示例代码:
java 复制代码
public class Person {
    private String name;
    private int age;

    // 构造方法、getter 和 setter 省略

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
  • 在上面的示例中,重写了 equals() 方法来比较两个 Person 对象的 name 和 age 属性是否相等,并且使用 Objects 类的 equals() 方法进行判断。同时,重写了 hashCode() 方法来计算对象的哈希码,使用 Objects 类的 hash() 方法来生成哈希码。这样就保证了在使用哈希表或哈希集合时能够正确地判断对象的相等性和唯一性。

本文由mdnice多平台发布

相关推荐
moton20171 小时前
云原生:构建现代化应用的基石
后端·docker·微服务·云原生·容器·架构·kubernetes
何中应1 小时前
Spring Boot中选择性加载Bean的几种方式
java·spring boot·后端
web2u2 小时前
MySQL 中如何进行 SQL 调优?
java·数据库·后端·sql·mysql·缓存
michael.csdn2 小时前
Spring Boot & MyBatis Plus 版本兼容问题(记录)
spring boot·后端·mybatis plus
Ciderw3 小时前
Golang并发机制及CSP并发模型
开发语言·c++·后端·面试·golang·并发·共享内存
Мартин.3 小时前
[Meachines] [Easy] Help HelpDeskZ-SQLI+NODE.JS-GraphQL未授权访问+Kernel<4.4.0权限提升
后端·node.js·graphql
程序员牛肉3 小时前
不是哥们?你也没说使用intern方法把字符串对象添加到字符串常量池中还有这么大的坑啊
后端
烛阴3 小时前
Go 语言进阶必学:&^ 操作符,高效清零的秘密武器!
后端·go
网络风云3 小时前
golang中的包管理-下--详解
开发语言·后端·golang
京东零售技术4 小时前
一次线上生产库的全流程切换完整方案
后端