Arrays.sort() 不是手写排序算法,而是调用优化实现,核心是通过 Comparator 控制元素顺序;基本类型数组仅支持升序,降序需转包装类;对象数组依赖 Comparator 自定义排序逻辑,需注意 null 处理与边界安全。

Java 中的 Arrays.sort() 不是“写排序算法”,而是调用已优化的标准排序实现,自定义逻辑靠 Comparator 注入。它不重写快排或归并,只决定“谁在前、谁在后”——这才是实战中真正可控、高频使用的部分。
基本类型数组:升序是默认,降序需绕行
int[]、double[] 等基本类型数组只能用无参 Arrays.sort(arr),内部走双轴快排,升序固定,不能传 Comparator。若要降序,必须转为包装类数组(如 Integer[]),再配合比较器:
Arrays.sort(nums, Comparator.reverseOrder())Arrays.sort(nums, (a, b) -> b.compareTo(a))- 避免
a - b写法,极端值可能整数溢出;优先用Integer.compare(a, b)
对象数组:Comparator 是核心入口
String[]、Person[] 等引用类型数组,默认按自然顺序(即 compareTo())排序。要自定义,必须传 Comparator,且推荐用 Lambda 表达式:
- 按字段升序:
Arrays.sort(people, Comparator.comparing(Person::getAge)) - 按字段降序:
Arrays.sort(people, Comparator.comparing(Person::getName).reversed()) - 多条件组合(先年龄升序,年龄相同时姓名降序):
Arrays.sort(people, Comparator.comparingInt(Person::getAge).thenComparing(Person::getName).reversed())
二维数组按行排序:本质是“行引用”比较
对 int[][] matrix 排序,其实是把每行(int[])当一个整体来比。例如按首列升序:
立即学习“Java免费学习笔记(深入)”;
Arrays.sort(matrix, (a, b) -> Integer.compare(a[0], b[0]))- 务必检查边界:若某行为空(
a == null || a.length == 0),直接调用a[0]会抛异常 - 可封装健壮逻辑:
(a, b) -> { if (a == null) return 1; if (b == null) return -1; return Integer.compare(a.length > 0 ? a[0] : 0, b.length > 0 ? b[0] : 0); }
null 值与稳定性:别让 NPE 中断流程
Arrays.sort() 对对象数组使用 Timsort,稳定但不自动处理 null。含 null 元素时,默认抛 NullPointerException。安全做法是显式委托:
- null 排末尾:
Arrays.sort(arr, Comparator.nullsLast(Comparator.naturalOrder())) - null 排开头:
Arrays.sort(arr, Comparator.nullsFirst(Comparator.naturalOrder())) - 若字段本身可能为 null(如
person.getName()),不要直接链式调用compareTo(),改用Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))


















