Arrays.sort() 的核心在于按数据类型选择正确用法:基本类型直接调用且不支持 Comparator;对象数组需通过 Comparable 或 Comparator 定义排序逻辑,多字段排序应链式组合并妥善处理 null。

Java 中 Arrays.sort() 是处理数组排序最直接、高效的方式,但不同数据类型和业务场景下,用法差异明显——关键不在“能不能排”,而在于“怎么告诉它按什么排”。
基本类型数组:直接调用,别传 Comparator
对 int[]、double[]、char[] 这类基本类型,只需传入数组即可完成升序排序。底层使用双轴快排(Dual-Pivot Quicksort),性能稳定且不支持自定义比较器。
- 正确写法:
Arrays.sort(nums); - 错误写法:
Arrays.sort(nums, (a, b) -> b - a);—— 编译失败,基本类型重载方法不接受 Comparator - 若需降序,先升序再反转(或转为
Integer[]后用 Comparator)
对象数组:必须靠 Comparator 或 Comparable
String[]、Person[] 等引用类型默认按内存地址排,无业务意义。要按字段排序,必须显式提供规则:
- 临时排序用
Comparator:比如Arrays.sort(people, Comparator.comparing(Person::getAge)) - 固定主排序逻辑可让类实现
Comparable:重写compareTo(),之后直接Arrays.sort(people) - 避免用
a.age - b.age手动减法,改用Integer.compare(a.age, b.age)防溢出
多字段与 null 值:链式 + 容错才是实战重点
真实业务常需“先按部门,再按薪资降序”,还可能含 null 数据。这时单靠 lambda 不够清晰,也容易崩:
立即学习“Java免费学习笔记(深入)”;
- 多级排序:用
Comparator.comparing(Person::getDept).thenComparing(Person::getSalary).reversed() - null 处理:不要等抛
NullPointerException,主动用Comparator.nullsLast(Comparator.comparing(Person::getName)) - 字段本身可能为 null?改用
comparing(p -> p.getName(), nullsLast(String::compareTo))
原地修改 vs 新数组:选对方式避免副作用
Arrays.sort() 永远修改原数组;如果需要保留原始顺序,或想组合过滤、映射等操作,应转向 Stream:
- 保持原数组不变:
Person[] sorted = Arrays.stream(people).sorted(comparator).toArray(Person[]::new); - 注意开销:Stream 创建中间对象,大数据量或高频调用时慎用
- 小范围排序更灵活:
Arrays.sort(arr, from, to)可只排子区间,比如对后半段单独升序


















