在 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(),以减少人为错误。


相关推荐
PPPPPaPeR.6 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
echoVic6 小时前
多模型支持的架构设计:如何集成 10+ AI 模型
java·javascript
橙露6 小时前
Java并发编程进阶:线程池原理、参数配置与死锁避免实战
java·开发语言
froginwe116 小时前
C 标准库 - `<float.h>`
开发语言
echoVic6 小时前
AI Agent 安全权限设计:blade-code 的 5 种权限模式与三级控制
java·javascript
PPPPickup6 小时前
easymall---图片上传以及图片展示
java
历程里程碑6 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Wpa.wk6 小时前
接口自动化 - 接口鉴权处理常用方法
java·运维·测试工具·自动化·接口自动化
Pluchon6 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
2501_916008896 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone