Arrays.sort() 是 Java 中排序自定义对象数组的首选方法,需通过 Comparable 接口或 Comparator 实现比较逻辑;后者更灵活,支持 Lambda、多条件链式排序、null 安全处理及避免整数溢出等特性。

Java 中对自定义对象数组排序,Arrays.sort() 是最直接、高效的选择。它不创建新数组,而是原地修改,关键在于提供明确的比较逻辑——要么让类实现 Comparable,要么传入 Comparator。后者更常用、更灵活,尤其适合多条件、临时规则或无法修改源码的场景。
用 Comparator 实现字段排序(推荐)
无需改动类定义,运行时指定规则,支持 Lambda、方法引用和链式组合:
- 按单个字段升序:用
Comparator.comparing()最简洁,例如Arrays.sort(people, Comparator.comparing(Person::getAge)) - 降序写法:在字段后加
.reversed(),如Comparator.comparing(Person::getName).reversed() - 避免整数溢出:比较 int 字段时,优先用
Comparator.comparingInt(Person::getAge),它内部调用Integer.compare(),比a.age - b.age更安全 - 字符串安全比较:若字段可能为 null,别直接调
a.name.compareTo(b.name),改用Comparator.nullsLast(Comparator.naturalOrder())包裹
多条件排序一次写到位
实际业务中常需“先按部门升序,部门相同时按入职时间降序”。Comparator 支持链式拼接,清晰表达优先级:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法示例:
Arrays.sort(employees, Comparator.comparing(Employee::getDept).thenComparing(Employee::getHireDate, Comparator.reverseOrder())) -
thenComparing()可嵌套多次,每级独立指定升/降序,不必手写 if-else 判断 - 如果某字段是包装类型(如
LocalDateTime),确保其本身实现了Comparable,否则需显式传入对应比较器
处理 null 值不崩溃
对象数组含 null 时,直接排序会抛 NullPointerException。不能靠 try-catch,而应在比较器中主动兼容:
立即学习“Java免费学习笔记(深入)”;
- null 排末尾:
Comparator.nullsLast(Comparator.comparing(Person::getScore)) - null 排开头:
Comparator.nullsFirst(Comparator.comparing(Person::getScore)) - 若整个对象可能为 null(比如数组元素是可选的 Person 引用),则用
Comparator.nullsLast(Comparator.comparing(p -> p != null ? p.getScore() : null))或更稳妥地拆解判断
Comparable vs Comparator 怎么选
二者不是替代关系,而是分工不同:
- 实现
Comparable:适合定义该类“天然的、唯一的主排序方式”,例如Student默认按学号升序。之后调用Arrays.sort(students)就自动生效 - 使用
Comparator:适合临时规则、多版本逻辑(同一类既要按年龄排又要按姓名排)、或第三方类无法修改源码的情况 - 注意:一个类可以同时实现
Comparable并在外部用Comparator,两者互不影响;Arrays.sort()会优先使用传入的Comparator,忽略Comparable

















