【大白话说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 自动生成工具,或者手动基于对象的关键属性实现一致性逻辑。
相关推荐
Ramble_Naylor2 分钟前
东方通(TongWeb)SpringBoot开发指导
java·spring boot
大鹏说大话8 分钟前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
uzong11 分钟前
面试官:如何做好架构设计
后端·架构
哆来A梦没有口袋14 分钟前
干货精讲 | 初级CSS面试高频考题
前端·css·面试
云烟成雨TD15 分钟前
Spring AI Alibaba 1.x 系列【64】 ReactAgent 长期记忆
java·人工智能·spring
plainGeekDev23 分钟前
Android运行时面试题:ART和JVM的区别都搞不清,别写精通了
jvm·面试·kotlin
quan263126 分钟前
20260529,日常开发-数据库主从问题
java·mysql·主从·延迟
Cosolar28 分钟前
QwenPaw Agent 实现原理深度剖析
后端·面试·架构
JacksonMx1 小时前
@Transactional 最佳实践
java·spring boot·spring·性能优化
Sincerelyplz1 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent