objects.compare用于安全委托comparator比较可能为null的字段值,避免空指针异常,常用于自定义comparator或配合comparing链式排序,不创建排序逻辑也不替代equals判等。

Objects.compare 本身不直接比较两个业务对象,而是帮你安全地委托给一个已有的 Comparator 去比较两个字段值——尤其当这些字段可能为 null 时。它的核心价值是省去手动判空逻辑,避免 NullPointerException。
用在自定义 Comparator 的 compare 方法里
这是最典型也最实用的场景:你在写自己的 Comparator<person></person> 时,不想自己写一堆 if-else 处理 name 为 null 的情况,就让 Objects.compare 来代劳。
- 传入两个待比字段(比如
p1.getName()和p2.getName()) - 再传一个针对该字段类型的比较器,比如
String::compareTo - 用
Comparator.nullsLast或Comparator.nullsFirst明确 null 的位置
示例:
Comparator配合 Comparator.comparing 构建链式排序
当你需要多字段排序(比如先按 age 升序,再按 name 升序),推荐用 Comparator.comparing 链式调用,它内部已封装了 Objects.compare 的语义,你只需指定每个字段的 null 策略。
-
comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))—— age 字段 null 排最后 -
thenComparing(p -> p.getName(), Comparator.nullsLast(String::compareTo))—— name 字段同样处理
这样写既清晰又安全,不用手写 compare 方法体。
注意它不替代 Comparator 本身
Objects.compare(a, b, c) 只是一个工具方法,它不会创建排序逻辑,也不参与实际排序流程(如 Arrays.sort())。它只是在你已有比较器 c 的基础上,加一层 null 安全包装。
- a 和 b 是你要比的具体值(通常是 getter 返回的字段)
- c 必须是非 null 的 Comparator,且类型要兼容 a、b
- 如果 a 和 b 都为 null,它返回 0;一个为 null 时,由 c 的 null 策略决定结果(如
nullsLast就返回正数)
别和 equals 混用
Objects.compare 返回的是排序意义上的“大小关系”(负数/零/正数),不是布尔等价判断。要判断两个对象字段是否相等,请用 Objects.equals(a, b) —— 它专为判等设计,同样 null-safe,但语义完全不同。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











