✅ Java 中 ==、equals() 与 hashCode()
在 Java 中,
==和equals()的区别主要体现在 引用类型 上:
🔹 ==
- 用于 基本数据类型 (
int、double、boolean等)时,比较的是 值是否相等 - 用于 引用类型 时,比较的是 两个引用是否指向同一个对象(内存地址是否相同)
🔹 equals()
- 是
Object类中定义的方法 - 如果 没有被重写 ,默认实现与
==相同,比较的也是 引用地址 - 在实际开发中,如果需要判断两个对象是否 逻辑相等(内容相等) ,通常会 重写
equals()方法 - 重写时一般使用
Objects.equals(a, b),以避免字段为null时出现 空指针异常
🔹 hashCode() 与 equals() 的关系
-
在 重写
equals()的同时,必须重写hashCode() -
因为在
HashMap、HashSet等哈希容器中:- 先通过
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 中一些常用类(如
String、Integer、Long等)- 已经重写了
equals()和hashCode()方法 - 用于比较对象的 内容是否相等
- 已经重写了
-
自定义实体类在参与比较,或作为
HashMap/HashSet的 key 时,通常需要 手动重写或使用 Lombok 生成
🧠 一句话面试总结
在 Java 中,
==用于比较基本类型的值或引用地址;
equals()用于判断对象的逻辑相等;重写
equals()时必须同时重写hashCode(),并且参与比较的字段应尽量是不可变的;实际项目中通常使用 Lombok 来生成
equals()和hashCode(),以减少人为错误。