【大白话说Java面试题】【Java基础篇】第38题:两个对象的hashCode()相同,则 equals()是否也一定为 true?

📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

第38题:两个对象的hashCode()相同,则 equals()是否也一定为 true?

📚 回答:

  • 核心概念
    在 Java 中,hashCode()equals() 是两个重要的方法,它们之间的关系遵循以下规则:
    • 如果两个对象通过 equals() 方法比较为 true,那么它们的 hashCode() 必须相等。
    • 如果两个对象的 hashCode() 相同,它们通过 equals() 比较的结果不一定为 true

1. 原因分析
  • 哈希冲突

    • hashCode() 的返回值是一个整数,而整数的范围是有限的(32位)。因此,在大量对象中,可能会出现不同的对象生成相同的 hashCode() 值,这就是哈希冲突
    • 即使两个对象的 hashCode() 相同,它们的内容(由 equals() 定义)可能完全不同。
  • 规范要求

    • Java 规范要求:如果两个对象通过 equals() 比较为 true,它们的 hashCode() 必须一致;但反之则不一定成立。

    💡 代码示例

    以下代码展示了 hashCode() 相同但 equals() 不同的情况:

java 复制代码
class Person {
    private String name;

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

    @Override
    public int hashCode() {
        return 1; // 强制所有对象返回相同的哈希值
    }

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

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice");
        Person p2 = new Person("Bob");

        System.out.println(p1.hashCode() == p2.hashCode()); // 输出 true
        System.out.println(p1.equals(p2)); // 输出 false
    }
}

💡 面试官视角

  • 面试官可能会问"为什么需要重写 hashCode()equals()?"答:为了保证集合类(如 HashMapHashSet)的正确性,避免因为哈希冲突导致数据存储或查找失败。
  • 面试官可能会追问"如何正确重写 hashCode()equals()?"答:可以使用 IDE 自动生成工具,或者手动基于对象的关键属性实现一致性逻辑。
相关推荐
拽着尾巴的鱼儿14 小时前
Idea:Cannot Run Git 无法运行git
java·git·intellij-idea
嘻哈baby15 小时前
大量消息在 MQ 里长时间积压,该如何解决?
开发语言
编程_大白15 小时前
IDEA配置SQL方言
java·sql·intellij-idea
橘子汽水16815 小时前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode
智购科技自动贩卖机15 小时前
自动售货机嵌入式系统安全加固实践:从Go语言国密算法到硬件防拆的工程化落地
大数据·人工智能·后端·安全·golang·系统安全
qq_5703985715 小时前
Three.js基础使用-案例
开发语言·javascript·ecmascript
Suxing915 小时前
C语言基础分享:C语言文件操作:从“写日记”到“拍电影”的存盘指南
c语言·开发语言
右耳朵猫AI15 小时前
Node.js周刊2026W36 | NestJS 12发布、Remix 3 RC、pnpm 12 Rust重写、Node.js 26.8.0
开发语言·rust·node.js
烂蜻蜓15 小时前
Flask入门教程(附录):模板渲染API——Jinja2集成全解析
后端·python·flask
摇滚侠15 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC容器的高级机制 Environment 阅读笔记 4
spring boot·笔记·后端