objects.equals(a, b)能天然规避空指针异常,因它先判空再调用equals,对称安全、语义清晰,适用于双变量可能为空场景,不隐式转换类型,是jdk 7+零成本标准方案。

阿里开发手册推荐使用 Objects.equals(a, b),核心原因是它能天然规避空指针异常(NullPointerException),同时保持语义清晰、调用安全。
避免 a.equals(b) 崩溃的最直接原因
当 a 为 null 时,a.equals(b) 会立即抛出 NullPointerException;而 Objects.equals(a, b) 内部先做空值判断:
-
if (a == b) return true→ 处理两个都为null或同一对象的情况 -
if (a != null) return a.equals(b)→ 仅在a非空时才调用其equals -
否则返回 false→a为null、b非空时结果明确且安全
比 "常量.equals(变量)" 更通用、更可读
手册也接受 "test".equals(obj) 这种写法来防 NPE,但它有局限:
- 只适用于一方确定非空(如字面量、常量),不适用于两个变量都可能为空的场景
- 当比较双方都是业务变量(如
user.getName()和otherUser.getName())时,无法简单指定谁做主调方 -
Objects.equals(a, b)对称、无主次,语义上更符合“判断二者是否相等”的本意
类型安全提醒:它不解决类型误配问题
Objects.equals 不做类型转换,也不在编译期校验参数一致性:
-
Objects.equals(1, 1L)→false(Integer和Long类型不同) -
Objects.equals("1", 1)→false(字符串与整数,不会自动解析或转型) - 这其实是优点:避免隐式转换带来的逻辑歧义,强制开发者明确类型意图
适用范围广,零成本接入
该方法是 JDK 7+ 标准 API,无需额外依赖:
- DTO 字段比对、Map 键查找、单元测试断言等常见场景均可直接替换
- 支持任意引用类型,包括
null、String、包装类、自定义对象(前提是已正确重写equals) - 性能开销极小,底层就是一次判空 + 一次委托调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











