arrays.sort() 并非简单“一键排序”,其针对基本类型数组采用双轴快排(小数组切插入排序),不支持comparator;对象数组则用timsort,需显式指定比较逻辑,支持稳定性、null处理及多条件排序,另有stream.sorted()作为不可变替代方案。

Java 中的 Arrays.sort() 不是“一键排序”那么简单——它背后有两套算法、两类约束、三种常见误用场景。用对了高效稳定,用错了编译报错或运行崩溃。
基本类型数组:快排直接上,但不许加 Comparator
int[]、double[]、char[] 等直接调用 Arrays.sort(arr) 即可升序排列,底层用双轴快排(Dual-Pivot Quicksort),小数组自动切插入排序,重复值多时也稳。
- 不能传 Comparator:写
Arrays.sort(nums, (a,b) -> b-a)会编译失败 - 想降序?转成 Integer[] 再用比较器,或排序后用
ArrayUtils.reverse()(需 Apache Commons)或手写翻转逻辑 - 只排一部分:用三参数重载
Arrays.sort(arr, fromIndex, toIndex),注意 toIndex 是开区间
对象数组:必须明确“谁比谁大”
String[]、Person[] 这类引用类型,默认按对象地址排,没意义。必须显式告诉 JVM 比较依据——靠 Comparator 或让类实现 Comparable。
- 用 Comparator 更灵活:不改类就能按 age、name、score 排,支持链式(先按部门,再按入职时间)
- 避免空指针:字段可能为 null?别直接
a.name.compareTo(b.name),改用Comparator.comparing(Person::getName, String::compareTo)或Comparator.nullsLast(Comparator.naturalOrder()) - 整数减法易溢出:年龄差用
Integer.compare(a.age, b.age),别写a.age - b.age
排序稳定性与 null 处理
对象数组排序用的是 TimSort(Timsort 变种),属于稳定排序:相同 key 的元素,原始相对顺序不会变。这点对分页、去重、多条件排序很关键。
- null 元素默认不兼容:数组含 null 直接排序抛
NullPointerException - null 放最后:
Comparator.nullsLast(Comparator.comparing(Person::getScore)) - null 放最前:
Comparator.nullsFirst(Comparator.comparing(Person::getScore))
替代方案:Stream.sorted() 适合不改原数组
如果不想动原数组,或要链式操作(过滤+排序+映射),Stream.sorted() 更自然:
- 写法简洁:
Person[] sorted = Arrays.stream(people).sorted(Comparator.comparing(p -> p.score)).toArray(Person[]::new) - 代价明确:创建新数组 + 流开销,大数据量或性能敏感场景慎用
- 不支持部分排序:没有类似
fromIndex/toIndex的范围控制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











