应使用Objects.equals(a, b)替代a.equals(b),因其内部先判空再调用equals,避免NullPointerException;当a为null时a.equals(b)直接抛异常,而Objects.equals能安全处理null参数。

直接用 Objects.equals(a, b) 替代 a.equals(b),它会自动处理任一参数为 null 的情况,避免 NullPointerException。
为什么 a.equals(b) 容易崩溃
当 a 为 null 时,调用 a.equals(b) 会立即抛出 NullPointerException;即使 b 为 null 而 a 非空,a.equals(null) 的行为取决于具体类的实现(如 String 返回 false),但并非所有类都安全支持传入 null。
Objects.equals() 的安全逻辑
该方法内部做了两层检查:
- 如果两个引用都为
null,返回true - 如果仅一个为
null,返回false - 如果都不为
null,才调用a.equals(b)
等价于手动写的健壮判断:return (a == b) || (a != null && a.equals(b));
典型使用场景与写法
适用于任意引用类型比较,尤其在以下位置推荐统一替换:
立即学习“Java免费学习笔记(深入)”;
- 实体类字段判等(如
user.getName()可能为null) - 集合查找(
list.stream().filter(u -> Objects.equals(u.getId(), id)).findFirst()) - 重写
equals()方法时(JDK 7+ 推荐写法)
示例:
String name1 = null; String name2 = "Alice"; boolean same = Objects.equals(name1, name2); // false,不抛异常
注意:它不能替代逻辑校验
Objects.equals() 解决的是“调用安全”问题,不是“语义合理”问题。比如:
- 两个
null被视为相等,是否符合你的业务含义?(如数据库中NULL != NULL) - 若需区分“未设置”和“空字符串”,应额外判断,而非依赖
Objects.equals
必要时配合 Objects.nonNull() 或 StringUtils.isEmpty() 做前置判断。


















