java中arrays.sort()定制排序需传入comparator,支持lambda、链式比较及null安全处理;基本类型数组不接受comparator,需装箱;使用timsort(稳定),仅适用于一维数组。

Java 中用 Arrays.sort() 实现定制排序,核心在于传入符合要求的比较器(Comparator),而不是重写元素类本身的 compareTo() 方法。它适用于数组(尤其是对象数组),且不改变原数组结构,只重排元素顺序。
使用 Comparator 匿名内部类或 Lambda 表达式
对自定义对象数组排序时,最常用方式是传入 Comparator。Lambda 写法简洁直观,推荐优先使用。
- 若按字符串字段升序:
Arrays.sort(people, (a, b) -> a.name.compareTo(b.name)); - 若按年龄降序:
Arrays.sort(people, (a, b) -> Integer.compare(b.age, a.age));(注意参数顺序翻转) - 支持链式比较:先按部门升序,部门相同时按薪资降序:
Arrays.sort(employees, Comparator.comparing(e -> e.department)<br> .thenComparing(e -> e.salary, Comparator.reverseOrder()));
处理 null 值的安全写法
默认比较器遇到 null 会抛 NullPointerException。需显式处理:
- 把
null排在前面:Comparator.nullsFirst(Comparator.naturalOrder()) - 把
null排在后面:Comparator.nullsLast(Comparator.naturalOrder()) - 例如对可能为 null 的 name 排序:
Arrays.sort(people, Comparator.nullsLast(Comparator.naturalOrder()));
(前提是 Person 的name字段实现了Comparable,如 String)
基本类型数组不能直接用 Comparator
Arrays.sort() 对 int[]、double[] 等基本类型数组**不接受 Comparator**,只能调用对应重载方法(如 Arrays.sort(int[])),它们按自然顺序排序。
- 如需对 int 数组按降序排,得先转成
Integer[]:Integer[] boxed = Arrays.stream(ints).boxed().toArray(Integer[]::new);<br> Arrays.sort(boxed, Comparator.reverseOrder());
- 注意装箱开销,大数据量时谨慎使用
注意 sort() 的稳定性与适用范围
Arrays.sort() 对对象数组使用的是 **Timsort**(稳定排序),相同元素的相对位置不会改变;对基本类型使用双轴快排(不稳定,但基本类型无“相等但不同”的概念)。
- 仅适用于一维数组;多维数组需自行实现行/列级排序逻辑
- 原始数组会被直接修改,如需保留原顺序,请先
Arrays.copyOf() - 泛型数组(如
T[])必须确保元素类型支持比较,否则运行时报ClassCastException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











