Java中Arrays.sort()支持自定义排序需传入Comparator,基本类型数组不支持Comparator须转包装类,对象数组推荐Lambda表达式,注意整数溢出、null安全及排序稳定性。

Java 中 Arrays.sort() 方法支持自定义排序逻辑,核心在于传入符合要求的比较器(Comparator),而非重写对象本身的 compareTo 方法。关键是要理解不同重载版本的适用场景和写法差异。
基本类型数组不能用 Comparator
对 int[]、double[] 等基本类型数组,Arrays.sort() 只提供原生升序排序,不接受 Comparator。若需降序或特殊规则,必须先转为对应的包装类型数组(如 Integer[])。
int[] arr = {3, 1, 4}; Arrays.sort(arr); // ✅ 升序Integer[] arr = {3, 1, 4}; Arrays.sort(arr, (a, b) -> b - a); // ✅ 降序Arrays.sort(arr, Comparator.reverseOrder()); // ✅ 同样降序,更清晰
对象数组用 Lambda 表达式最简洁
对自定义类(如 Person)的数组,推荐用 Lambda 实现 Comparator,可链式组合多级排序。
- 按年龄升序:
Arrays.sort(people, (p1, p2) -> Integer.compare(p1.age, p2.age)); - 先按姓名升序,再按年龄降序:
Arrays.sort(people, Comparator.comparing(p -> p.name).thenComparing(p -> p.age, Comparator.reverseOrder())); - 注意:避免直接用
p1.age - p2.age,可能整数溢出;优先用Integer.compare()
复用已有 Comparator 或实现独立类
当排序逻辑复杂或需多处复用时,可预先定义 Comparator 实例或单独类。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 静态常量:
public static final Comparator<person> BY_AGE_DESC = (p1, p2) -> Integer.compare(p2.age, p1.age);</person> - 独立类:
class AgeDescComparator implements Comparator<person> { public int compare(Person p1, Person p2) { return Integer.compare(p2.age, p1.age); } }</person> - 调用:
Arrays.sort(people, BY_AGE_DESC);或Arrays.sort(people, new AgeDescComparator());
注意 null 安全和稳定性
Arrays.sort() 使用的是双轴快排(Java 7+),是不稳定排序 —— 相等元素的相对位置可能改变。若需稳定排序(如保持原始输入顺序),应改用 Collections.sort() 配合 Arrays.asList(),或自行使用归并排序实现。
- 处理 null 值:Lambda 中需主动判空,或使用
Comparator.nullsFirst()/Comparator.nullsLast() - 例如:
Arrays.sort(strings, Comparator.nullsLast(String::compareTo)); - 若数组含 null 且未处理,运行时抛
NullPointerException
不复杂但容易忽略细节,关键是选对数组类型、写对比较逻辑、留意 null 和稳定性需求。

















