objects.equals() 能天然避免空指针异常,因其内部对参数判空:任一为 null 时返回 false,二者同为 null 时返回 true;而 a.equals(b) 在 a 为 null 时直接抛 npe。

用 Objects.equals() 替代 a.equals(b),能天然避免空指针异常,是 Java 7+ 中最简洁、安全的对象相等性判断方式。
为什么不用 a.equals(b)?
直接调用对象的 equals() 方法时,如果左边操作数(a)为 null,会立即抛出 NullPointerException。比如:
// 危险!a 为 null 时崩溃if (a.equals(b)) { ... }
而 Objects.equals(a, b) 内部做了判空处理:只要任一参数为 null,就直接返回 false(两个都为 null 时才返回 true),完全规避 NPE。
Objects.equals 的实际用法
它接受任意两个 Object 类型参数,适用于所有场景:
- 比较字符串:
Objects.equals(str1, str2)—— 不用再写str1 != null && str1.equals(str2) - 比较自定义对象:
Objects.equals(user1, user2)—— 前提是你的类已正确重写equals()和hashCode() - 混合类型比较(结果恒为 false):
Objects.equals("abc", 123)是安全的,不会报错 - 含 null 的集合元素对比:
Objects.equals(list.get(0), target)即使 get 返回 null 也不崩
和 ==、StringUtils.equals 的区别
别用 == 比对象:只比引用,基本类型或字符串字面量才偶尔适用。
StringUtils.equals(Apache Commons)虽也空安全,但仅限 String;而 Objects.equals 是 JDK 原生通用方案,无需额外依赖,语义更清晰。
注意:它不替代逻辑判断。例如两个 BigDecimal 需用 compareTo() == 0,不能只靠 equals()(因 new BigDecimal("1.0") 和 new BigDecimal("1") 的 equals 返回 false)。
小技巧:配合 Optional 或 record 使用更顺滑
在 Java 14+ 中,若用 record 定义数据类,它自动实现结构化 equals(),搭配 Objects.equals() 几乎零配置就能安全比对。
若值来自 Optional,可直接: Objects.equals(opt1.orElse(null), opt2.orElse(null)),或更推荐用 opt1.equals(opt2)(Optional 自身已重写 equals)。










