arrays.sort() 需按类型正确使用:基本类型直接调用升序,不可传comparator;引用类型必须提供comparator,注意null安全、多条件排序及stream替代场景。

Java 中的 Arrays.sort() 是最常用、最高效的数组排序工具,但真正用好它,关键不在“会不会调用”,而在“怎么定制才安全、清晰、可维护”。它不是万能黑盒,而是需要你明确告诉 JVM:两个元素谁该排在前。
基本类型数组:升序是默认,别传 Comparator
对 int[]、double[]、char[] 这类基本类型数组,直接调用 Arrays.sort(arr) 即可升序排列。内部使用双轴快排,性能可靠。
- 写
Arrays.sort(nums, (a, b) -> a - b)会编译失败——基本类型数组不接受Comparator - 如需降序,必须先转成包装类数组,例如
Integer[],再配合Comparator.reverseOrder()或 Lambda - 部分排序可用
Arrays.sort(arr, from, to),范围是左闭右开,比如[1, 4)表示索引 1、2、3 三个位置
对象数组排序:Comparator 是核心入口
对 String[]、Person[] 等引用类型,默认按对象地址排序,毫无业务意义。必须显式传入 Comparator 来定义规则。
- Lambda 最简洁:
Arrays.sort(people, (a, b) -> a.getAge() - b.getAge())(注意整数溢出风险,建议用Integer.compare(a.getAge(), b.getAge())) - 字符串按长度升序:
Arrays.sort(words, Comparator.comparing(String::length)) - 降序写法统一推荐:
Comparator.comparing(Person::getScore).reversed(),语义清晰且安全
多条件与 null 安全:稳定排序不等于自动容错
Arrays.sort() 对对象数组使用 TimSort(稳定排序),相同元素相对位置不变——但这不解决 null 问题。含 null 元素时,不处理会直接抛 NullPointerException。
- 让
null排最后:Comparator.nullsLast(Comparator.naturalOrder()) - 让
null排最前:Comparator.nullsFirst(Comparator.naturalOrder()) - 多字段组合:先按部门升序,部门相同时按薪资降序 →
Comparator.comparing(Employee::getDept).thenComparing(Employee::getSalary, Comparator.reverseOrder()) - 字段可能为
null?避免直接调a.name.compareTo(b.name),改用Comparator.comparing(Employee::getName, Comparator.nullsLast(String::compareTo))
替代方案:Stream.sorted() 适合“不改原数组”场景
如果排序只是中间步骤,后续还要过滤、映射或不想修改原始数据,Stream 更合适:
- 语法函数式:
Person[] sorted = Arrays.stream(people).sorted(Comparator.comparing(Person::getAge)).toArray(Person[]::new) - 优势是链式流畅、不污染原数组;劣势是创建新数组+额外对象开销,大数据量或高频调用时需权衡
- 无法替代原地排序的低延迟要求,比如实时仪表盘频繁刷新排序结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











