Java中推荐使用Objects.equals和Objects.hash替代==和equals()手动判空,前者安全处理null并简化代码,后者简化hashCode计算且保证与equals逻辑一致。

Java 中直接用 == 或 equals() 比较对象容易出错,尤其是处理 null 时。用 Objects.equals 和 Objects.hash 能显著减少样板代码、避免空指针异常,并让逻辑更清晰。
用 Objects.equals 安全比较两个对象是否相等
Objects.equals(a, b) 内部自动判空:当任一参数为 null 时,直接返回 false(除非两者都为 null,此时返回 true)。它本质是 a == b || (a != null && a.equals(b)) 的安全封装。
- 替代手写
if (a == null ? b == null : a.equals(b))这类冗长判断 - 在重写
equals()方法时,字段比较推荐统一用Objects.equals(field1, other.field1) - 适用于任意引用类型(包括字符串、集合、自定义对象),无需担心
NullPointerException
用 Objects.hash 快速生成稳定哈希值
Objects.hash(obj1, obj2, ..., objN) 接收可变参数,对每个非 null 对象调用其 hashCode(),对 null 统一按 0 处理,最后组合成一个 int 值。它比手动写 31 * (31 * a.hashCode() + b.hashCode()) + c.hashCode() 更简洁可靠。
- 重写
hashCode()时,直接返回Objects.hash(field1, field2, field3) - 保证与
equals()逻辑一致:若两个对象Objects.equals返回true,它们的Objects.hash结果也应相同(前提是字段的hashCode()正确) - 不依赖字段顺序——传参顺序决定哈希计算顺序,所以保持和
equals()中比较顺序一致即可
配合使用:重写 equals 和 hashCode 的标准写法
以一个简单 User 类为例:
立即学习“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(name, user.name) &&
Objects.equals(age, user.age) &&
Objects.equals(email, user.email);
}
<p>@Override
public int hashCode() {
return Objects.hash(name, age, email);
}这样写既安全又易读,不需要单独判空、也不用记乘数和加法顺序。
注意边界情况和常见误区
Objects.equals 和 Objects.hash 是工具方法,不是万能解药:
- 它们不解决语义问题:比如两个
BigDecimal用equals()比较值是否相等,但compareTo()才是更稳妥的方式;Objects.equals只是帮你安全调用已有逻辑 -
Objects.hash不适合高频调用场景(如循环内),因每次都会新建数组包装参数,有轻微开销;一般业务代码中影响极小 - 如果字段本身是数组(如
int[]),需用Arrays.equals()和Arrays.hashCode(),因为Objects方法对数组只比较引用


















