arrays.sort()是java数组排序最常用高效方式:基本类型直接调用(双轴快排),引用类型需传comparator(timsort,稳定);支持lambda、多字段链式及null处理;stream.sorted()可不改原数组但有开销。

Java中对数组排序,Arrays.sort() 是最常用且高效的方式。它既支持基本类型数组的自然排序,也支持引用类型数组的自定义排序——关键在于传入合适的 Comparator。
基本类型数组:直接调用,无需额外参数
对于 int[]、double[]、char[] 等基本类型数组,Arrays.sort() 会按升序自动排序,内部使用双轴快排(Dual-Pivot Quicksort),性能稳定。
int[] nums = {5, 2, 8, 1}; Arrays.sort(nums); // 结果:[1, 2, 5, 8]- 注意:不能对基本类型数组传
Comparator,编译会报错
对象数组:必须提供 Comparator 实现自定义逻辑
对 String[]、自定义类数组(如 Person[])等引用类型,默认按对象地址排序,无实际意义。需显式传入 Comparator 来定义比较规则。
- 可用 Lambda 表达式简洁实现:
Person[] people = {...};<br> Arrays.sort(people, (a, b) -> a.getAge() - b.getAge()); // 按年龄升序 - 若需降序,交换参数位置或加负号:
(a, b) -> b.getAge() - a.getAge()或Comparator.comparingInt(Person::getAge).reversed() - 多字段排序可链式调用:
Arrays.sort(people, Comparator.comparing(Person::getName).thenComparing(Person::getAge));
注意事项:null 值与稳定性
Arrays.sort() 对引用类型使用的是归并排序(Timsort 变种),是稳定排序——相同元素的相对位置不会改变。但默认不支持 null 元素。
- 若数组含
null,直接排序会抛NullPointerException - 可在
Comparator中主动处理:Arrays.sort(arr, Comparator.nullsLast(Comparator.naturalOrder()));
这会让null排在末尾;用nullsFirst则排在开头 - 避免在
compare()方法中直接调用a.field.compareTo(b.field),除非确认字段非 null
替代方案:Stream.sorted() 适合链式处理
如果已有集合或想保持原数组不变,可转为流排序:
Person[] sorted = Arrays.stream(people)<br>
.sorted(Comparator.comparing(Person::getScore).reversed())<br>
.toArray(Person[]::new);
- 优点:不修改原数组,语法函数式,易组合过滤、映射等操作
- 缺点:创建新数组,有额外开销;不适合超大数组或性能敏感场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











