Arrays.sort() 是一套智能调度系统:基本类型数组根据长度和有序性自动选用插入排序、双轴快排或归并排序;对象数组默认使用稳定且自适应的 TimSort;支持区间排序与自定义比较器,但基本类型不支持 Comparator。

Java 的 Arrays.sort() 不是“一个排序算法”,而是一套智能调度系统——它根据数据类型、数组长度、元素分布特征,自动选用最合适的底层算法。理解这点,才能避开误用陷阱,真正用好它。
基本类型数组:双轴快排为主,但会动态降级或升级
对 int[]、long[]、double[] 等基本类型,JDK 7+ 默认使用 Vladimir Yaroslavskiy 提出的双轴快速排序(Dual-Pivot Quicksort),但它不是一成不变的:
- 元素个数 < 47:直接用插入排序——小数组开销低、常数项优
- 47 ≤ 元素个数 < 286:启用双轴快排,带三向切分和中位数选轴优化
- ≥ 286 且被检测为“高度无序”:自动切换为归并排序,避免快排最坏 O(n²) 退化
这种自适应机制让排序在各种输入下都保持稳健,开发者无需手动判断规模或预估数据有序性。
对象数组:默认 TimSort,稳定且擅长现实数据
对 String[]、Integer[] 或实现了 Comparable 的自定义对象数组,Arrays.sort() 调用的是 TimSort:
立即学习“Java免费学习笔记(深入)”;
- 本质是优化版归并排序 + 插入排序混合体,能识别并利用数组中已有的升序/降序片段(称为“run”)
- 时间复杂度始终为 O(n log n),最坏情况也不退化
- 保持稳定性:相同元素的原始相对位置不会打乱,这对按多字段排序(如先按年级、再按姓名)很关键
即使传入 Comparator 自定义规则,只要操作的是对象数组,底层仍走 TimSort 路径。
排序范围与自定义比较:灵活但有边界
Arrays.sort() 支持精细控制:
- 指定区间排序:
Arrays.sort(arr, fromIndex, toIndex)—— 注意toIndex是开区间,不包含该索引 - 倒序排列:
Arrays.sort(arr, Collections.reverseOrder())(对象数组)或用 Lambda:Arrays.sort(arr, (a, b) -> Integer.compare(b, a)) - 自定义字段排序(如学生按年龄):
Arrays.sort(students, Comparator.comparingInt(s -> s.age))
注意:基本类型数组不支持 Comparator,若需自定义逻辑(如按绝对值排序),得先转成包装类数组(如 Integer[]),再配合比较器使用。
关键注意事项:原地修改、null 安全与复制习惯
几个容易踩坑的点:
- 所有
Arrays.sort()都是原地排序,直接修改原数组——如需保留原始顺序,调用前用Arrays.copyOf()复制一份 - 对象数组中若含
null元素,且未提供Comparator(或比较器未处理 null),运行时抛NullPointerException -
boolean[]只支持默认升序,不支持自定义比较;byte[]、char[]等则按数值/ASCII 值排序,非语义意义
它高效,但不是黑箱魔法。知道它何时用快排、何时切归并、为何对象必须稳定,写出来的代码才更可靠。


















