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


相关推荐
一定要AK4 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao4 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao4 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
lly2024064 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨4 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn9994 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏4944 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
彧翎Pro5 小时前
基于 RO1 noetic 配置 robosense Helios 32(速腾) & xsense mti 300
前端·jvm
功德+n5 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
明日清晨5 小时前
python扫码登录dy
开发语言·python