arrays.sort() 自定义排序核心是明确比较逻辑而非修改数组,基本类型默认升序且不可传comparator,对象数组需用comparator实现多条件、null安全等复杂排序。

Java 中用 Arrays.sort() 实现自定义排序,核心在于明确“谁和谁比、怎么比”,而不是改数组本身或写复杂算法。它直接修改原数组,高效且简洁,但不同数据类型用法差异明显——用错参数或忽略 null 就会报错。
基本类型数组:升序是默认,别传 Comparator
int[]、double[]、char[] 这类数组,Arrays.sort(nums) 就能完成升序,内部用双轴快排,速度快也稳定。不需要、也不能传 Comparator,否则编译不通过。
- 正确写法:
int[] arr = {3, 1, 4}; Arrays.sort(arr); // → [1, 3, 4] - 错误写法:
Arrays.sort(arr, (a, b) -> b - a); // 编译失败 - 想降序?只能先升序再手动翻转,或转成 Integer[] 再用 Comparator
对象数组:Comparator 是关键入口
String[]、Person[]、Integer[] 等引用类型数组,默认按自然顺序(比如字符串字典序、Integer 数值大小)排。要按其他规则排,必须传 Comparator 实例。
- 用 Lambda 最简:
Arrays.sort(names, (a, b) -> a.length() - b.length()); // 按长度升序 - 防整数溢出,别直接减:
Arrays.sort(scores, (a, b) -> Integer.compare(b, a)); // 安全降序 - 字符串降序更推荐:
Arrays.sort(words, Comparator.reverseOrder());
多字段 & null 安全:链式组合 + 显式兜底
现实业务常需“先按年龄降序,年龄相同时按姓名升序”,或数组里混着 null。这些不能靠猜,得靠 Comparator 的组合能力。
- 多条件链式:
Arrays.sort(people, Comparator.comparing(Person::getAge).reversed().thenComparing(Person::getName)); - null 排最后:
Arrays.sort(arr, Comparator.nullsLast(Comparator.naturalOrder())); - null 排最前:
Arrays.sort(arr, Comparator.nullsFirst(Comparator.comparing(String::length))); - 字段可能为 null?别直接调
a.name.compareTo(b.name),先判空或用Comparator.nullsLast(Comparator.comparing(...))
替代与边界:什么时候不该用 sort?
Arrays.sort() 原地修改、性能好,但不是万能解。有些场景更适合绕开它。
- 不想改原数组?用 Stream:
Person[] sorted = Arrays.stream(people).sorted(comparator).toArray(Person[]::new); - 只排一部分?用范围重载:
Arrays.sort(arr, 2, 5); // 排索引 2 到 4(左闭右开) - 超大数组或高频排序?注意 Stream 创建流有开销,Timsort 在小数组上也退化为插入排序
- 类有固定主序?实现 Comparable 接口,之后
Arrays.sort(people)就自动生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











