Arrays.sort 的核心是显式控制排序行为:基本类型仅支持升序且不可定制,需转包装类实现降序或部分排序;对象数组必须用 Comparator 处理多字段、null 策略及稳定性要求。

Java 中 Arrays.sort 的高级应用,核心不在“怎么调用”,而在“怎么控制排序行为”——它不自动猜你想要什么顺序,而是靠你显式定义规则。基本类型和对象数组的处理逻辑完全不同,混用容易报错;多字段、null、稳定性这些细节,稍不注意就出问题。
基本类型数组:升序是唯一内置选项
int[]、double[]、char[] 等直接调用 Arrays.sort(nums) 就能升序排列,内部按长度智能选算法(小数组插排、中等规模双轴快排、大数组切归并),但不支持传 Comparator,也不支持降序。
- 想降序?必须转成包装类数组,比如 Integer[],再用 Comparator.reverseOrder() 或 (a, b) -> b.compareTo(a)
- 只排一部分?用三参数版本:Arrays.sort(arr, 2, 6),范围是索引 2 到 5(左闭右开)
- 要保留原数组?提前 clone():int[] sorted = nums.clone(); Arrays.sort(sorted);
对象数组:Comparator 是标配,不是可选
String[]、Person[] 这类引用类型数组,默认不按内容排,而是按内存地址——毫无业务意义。必须提供 Comparator,否则运行时报 ClassCastException。
- 单字段升序:Arrays.sort(people, Comparator.comparing(Person::getName))
- 单字段降序:Arrays.sort(people, Comparator.comparing(Person::getAge).reversed())
- 多字段组合:先按部门升序,部门相同时按薪资降序 —— Arrays.sort(people, Comparator.comparing(Person::getDept).thenComparing(Person::getSalary).reversed())
null 元素处理:不能跳过,必须声明策略
数组里有 null?Arrays.sort 直接抛 NullPointerException。它不会帮你猜“null 算最大还是最小”,得你明说。
立即学习“Java免费学习笔记(深入)”;
- null 排最后:Comparator.nullsLast(Comparator.naturalOrder())
- null 排最前:Comparator.nullsFirst(Comparator.naturalOrder())
- 字段可能为 null?别直接调 .compareTo(),改用 comparing(…, nullsLast(String::compareTo))
- 或者提前过滤:people = Arrays.stream(people).filter(Objects::nonNull).toArray(Person[]::new);
稳定性与算法差异:影响结果,不止是性能
Arrays.sort 对基本类型用双轴快排(不稳定),对对象数组用 TimSort(稳定)。这意味着:
- 两个学生分数相同,稳定排序会保持他们原始录入的先后顺序;快排则可能打乱
- 如果业务依赖“同分者按提交时间先后显示”,就必须用对象数组 + Comparator,不能用 int[] 存分数再排
- 需要稳定但又操作基本类型?转 Integer[],代价是少量装箱开销,换来逻辑确定性


















