Java中Arrays.sort是智能多策略系统:基本类型用双轴快排(小数组退化为插入排序),对象数组用稳定TimSort(识别天然有序段并归并),兼顾性能与稳定性。

Java中Arrays.sort不是“一个算法”,而是根据数据类型智能切换的多策略排序系统——基本类型走双轴快排,对象数组走TimSort,背后有大量工程级优化。
基本类型用双轴快排,小数组自动切插入排序
对int[]、long[]等,JDK 7起默认使用双轴快速排序(Dual-Pivot Quicksort)。它选两个基准值把数组分成三段,比单轴快排减少比较次数。但真正影响日常性能的是它的自适应机制:
- 当子数组长度小于47时,直接退化为插入排序——小规模数据下插入排序常比快排更快
- 用“五取样法”选轴:取首、中、尾及中间两点共5个元素,取中位数作为双轴,避免最坏划分
- 遇到大量重复元素时,采用三向切分(< pivot1|pivot1 ≤ x ≤ pivot2|> pivot2),跳过重复块提升效率
对象数组用TimSort,稳定且擅长部分有序数据
String[]、Integer[]或自定义类数组(实现Comparable或传Comparator)统一使用TimSort。它不是简单归并,而是:
- 先扫描数组,识别天然有序片段(Run),比如
[3,5,7]或[9,6,2](降序反转后也视为Run) - 对短Run补足到最小长度(通常32),用二分插入排序填充
- 再用归并框架合并Run,过程中启用Galloping Mode——当某一段连续胜出多次,就改用指数搜索加速定位
这意味着:原数组越接近有序,TimSort实际运行越快,最好情况可达O(n);且它是稳定排序,相同元素相对位置不变。
立即学习“Java免费学习笔记(深入)”;
指定范围排序与并行替代方案
不需要全量排序时,可精准控制范围:
-
Arrays.sort(arr, fromIndex, toIndex)只排序[fromIndex, toIndex)区间,适用于Top-K预处理、滑动窗口等场景 - 对于超大数组(如百万级),
Arrays.parallelSort()会按CPU核数分段排序再归并,实测在多核机器上提速明显 - 注意:
parallelSort对小数组反而有开销,一般建议数组长度 > 10⁴ 再考虑
避坑要点:原地修改、稳定性差异与线程安全
几个容易忽略但影响上线行为的关键点:
- 所有
sort方法都是原地修改,不返回新数组。需保留原顺序时,先用Arrays.copyOf()复制 - 基本类型排序不稳定(相同值可能换位),对象数组排序稳定——若业务依赖相等元素顺序,别用基本类型包装成
int[]再转Integer[] -
sort本身不加锁,多线程并发修改同一数组会出错;如需并发安全,应由上层控制访问同步 - 传
Comparator时避免空指针或逻辑错误(如a - b溢出),推荐用Integer.compare(a, b)



















