在 Java 中,`==` 和 `equals()` 的区别

✅ Java 中 ==equals()hashCode()

在 Java 中,==equals() 的区别主要体现在 引用类型 上:


🔹 ==

  • 用于 基本数据类型intdoubleboolean 等)时,比较的是 值是否相等
  • 用于 引用类型 时,比较的是 两个引用是否指向同一个对象(内存地址是否相同)

🔹 equals()

  • Object 类中定义的方法
  • 如果 没有被重写 ,默认实现与 == 相同,比较的也是 引用地址
  • 在实际开发中,如果需要判断两个对象是否 逻辑相等(内容相等) ,通常会 重写 equals() 方法
  • 重写时一般使用 Objects.equals(a, b),以避免字段为 null 时出现 空指针异常

🔹 hashCode()equals() 的关系

  • 重写 equals() 的同时,必须重写 hashCode()

  • 因为在 HashMapHashSet 等哈希容器中:

    • 先通过 hashCode() 计算哈希值,定位存储位置(桶)
    • 再通过 equals() 判断对象是否真正相等
  • 为了保证哈希容器行为正确,必须满足:

    • equals() 相等的对象,hashCode() 必须相等
    • hashCode() 相等的对象,equals() 不一定相等

🔹 作为 HashMap / HashSet 的 key 的注意事项(真实开发重点)

  • 参与 equals()hashCode() 的字段 应尽量是不可变的
  • 不建议使用 会被修改的字段(如状态、余额、时间等)
  • 否则可能导致对象 put 进容器后,修改字段,再 get找不到对应的对象

🔹 多字段对象如何实现 equals / hashCode

  • 不要求使用所有字段

  • 一般选择:

    • id
    • 业务唯一键
  • 这些字段能唯一标识一个业务对象即可

  • 常见实现方式:

    java 复制代码
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

🔹 Lombok 在实际开发中的使用(面试加分点)

  • 在实际项目中,通常会使用 Lombok 自动生成 equals()hashCode(),以减少手写错误

  • 常见写法:

    java 复制代码
    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    public class User {
    
        @EqualsAndHashCode.Include
        private Long id;
    
        private String name;
        private String email;
    }
  • 这样可以明确指定哪些字段参与比较,更安全、更易维护


🔹 Java 已经重写好的常用类

  • Java 中一些常用类(如 StringIntegerLong 等)

    • 已经重写了 equals()hashCode() 方法
    • 用于比较对象的 内容是否相等
  • 自定义实体类在参与比较,或作为 HashMap / HashSet 的 key 时,通常需要 手动重写或使用 Lombok 生成


🧠 一句话面试总结

在 Java 中,== 用于比较基本类型的值或引用地址;
equals() 用于判断对象的逻辑相等;

重写 equals() 时必须同时重写 hashCode(),并且参与比较的字段应尽量是不可变的;

实际项目中通常使用 Lombok 来生成 equals()hashCode(),以减少人为错误。


相关推荐
Coder_Boy_2 小时前
Spring AI 源码大白话解析
java·人工智能·spring
计算机学姐2 小时前
基于SpringBoot的高校论坛系统【2026最新】
java·vue.js·spring boot·后端·spring·java-ee·tomcat
予枫的编程笔记2 小时前
Redis 核心数据结构深度解密:从基础命令到源码架构
java·数据结构·数据库·redis·缓存·架构
JIngJaneIL2 小时前
基于java + vue校园跑腿便利平台系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
happybasic2 小时前
python字典中字段重复性的分析~~
开发语言·python
Yana.nice2 小时前
JVM与KVM
jvm
飞舞花下2 小时前
MAVEN私有仓库配置-Nexus私有仓库
xml·java·maven
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 基于SpringBoot的健身房管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
czlczl200209253 小时前
SpringBoot自动配置AutoConfiguration原理与实践
开发语言·spring boot·后端