Object.equals()不处理null比较,调用null.equals()会抛出NullPointerException;Objects.equals()才安全支持null,当a==b(含同为null)时返回true,否则仅在a非null时调用a.equals(b)。

Object 类本身不处理两个 null 对象的安全相等性比较。
这是关键前提:Object.equals() 方法要求调用者(即 obj.equals(...) 中的 obj)必须非 null。如果直接对 null 调用 equals,例如:
String a = null;
a.equals("test"); // 抛出 NullPointerException会立即崩溃 —— 因为 null 不是对象,没有方法可调用。
所以,Object 类的 equals 方法不负责、也无法处理 null 参与的比较。它只定义了“非 null 对象间语义相等”的契约(对称、传递、一致等),但把 null 的边界情况完全交由调用方处理。
立即学习“Java免费学习笔记(深入)”;
真正解决“两个可能为 null 的对象是否逻辑相等”这个问题的,是 java.util.Objects.equals(Object a, Object b) —— 它不是 Object 类的方法,而是 Objects 工具类提供的静态方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
它的逻辑是:
- 如果
a == b(包括两者都为null的情况),返回true - 否则,若
a != null,才调用a.equals(b) - 若
a == null且b != null,直接返回false
因此:
-
Objects.equals(null, null)→true -
Objects.equals(null, "abc")→false -
Objects.equals("abc", null)→false -
Objects.equals("abc", "abc")→true
这层 null 安全判断,是 Objects.equals 做的,不是 Object.equals 做的。
你不能指望 Object 类自动兜底 null;必须显式使用 Objects.equals,或自己写等价逻辑(如 "abc".equals(x) 这种常量前置技巧),才能安全覆盖所有 null 组合。
它不改变 Object 的设计,而是提供一个更实用、更健壮的封装。

















