java中判断对象相等需区分地址相等(==)和内容相等(equals()),重写equals时须同步重写hashcode,推荐用objects.equals()等工具保障null安全与规范性。

Java 中判断两个对象是否相等,关键在于分清“地址相等”和“内容相等”两种需求,对应使用 == 和 equals(),且需注意 null 安全与重写规范。
用 == 判断是否是同一个对象
== 是运算符,对引用类型比较的是内存地址:
- 如果两个变量指向堆中同一块内存(即同一个对象实例),结果为 true;
- 即使内容完全一样,但创建了两个不同实例(如
new String("abc")调用两次),== 返回 false; - 基本类型(如 int、char)用 == 比较值,没问题;但别拿 == 去比包装类(如 Integer)的数值——在 -128~127 范围外可能因缓存缺失而误判。
用 equals() 判断内容是否一致
默认的 equals() 继承自 Object 类,行为等同于 ==。要按字段值判断相等,必须在自定义类中重写:
- 先用
this == obj快速判断是否为同一引用; - 检查参数是否为 null,避免空指针;
- 用
getClass() != obj.getClass()确保类型一致(不建议用instanceof,破坏对称性); - 强制转型后,逐个比较关键字段:基本类型用 ==,引用类型用 Objects.equals(a, b)(自动处理 null)。
安全又省事的工具方法
自己手写 equals 容易出错,推荐直接用 JDK 提供的工具:
-
Objects.equals(obj1, obj2)(Java 7+):内部已处理 null,一行搞定,无需判空; - 集合、数组等复杂结构,可用
Arrays.equals()或Objects.deepEquals(); - 若项目引入 Apache Commons Lang,
ObjectUtils.nullSafeEquals()效果类似Objects.equals,语义更明确。
别忘了 hashCode 的配套义务
只要重写了 equals(),就必须重写 hashCode(),否则放进 HashMap、HashSet 会出问题:
- 两个 equals 返回 true 的对象,hashCode 必须相同;
- 反之不成立——hashCode 相同,不一定 equals;
- IDE(如 IntelliJ)可一键生成符合规范的 equals + hashCode 方法,推荐使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











