Arrays.sort()对基本类型用双轴快排(Java 7起),平均O(n log n)、原地排序;对对象数组用Timsort,稳定、O(n log n)、需O(n)额外空间;区分因基本类型无需稳定性且比较快,对象需稳定性和减少比较开销。

Arrays.sort() 在 Java 中对基本类型和对象数组使用了不同的底层排序算法,这是为了兼顾性能、稳定性与适用场景。
基本类型用双轴快排(Dual-Pivot Quicksort)
从 Java 7 开始,int、long、double 等基本类型数组调用 Arrays.sort() 时,实际执行的是 双轴快速排序(由 Vladimir Yaroslavskiy 提出)。它比传统单轴快排平均性能更好,尤其在大量重复元素或部分有序数据上表现更稳定。
- 不保证稳定性(但基本类型无“相等但需区分”的概念,所以不影响结果)
- 平均时间复杂度为 O(n log n),最坏情况仍是 O(n²),但实践中极难触发
- 原地排序,空间复杂度为 O(log n)(递归栈深度)
对象数组用归并排序(Timsort 的变种,Java 7+ 改为 TimSort)
对于实现了 Comparable 接口的对象数组(如 String[]、Integer[]),或传入 Comparator 的情况,Java 7 及以后版本使用的是 Timsort——一种针对真实数据优化的稳定归并排序变体。
- 保证稳定性:相等元素的相对顺序不会改变
- 对已排序或近似有序的数据接近 O(n),最坏和平均都是 O(n log n)
- 需要额外 O(n) 的临时空间
- 适合处理现实场景中常含局部有序片段的数据(如日志、时间序列)
为什么这样区分?关键在稳定性与抽象成本
基本类型没有身份(identity),两个 5 完全等价,无需关心谁在前谁在后;而对象可能有业务含义(比如两个同分数的学生,需保持录入顺序),稳定性就变得重要。同时,对象比较涉及方法调用开销,Timsort 减少比较次数的优势更明显;基本类型比较极快,双轴快排的低常数因子更能发挥硬件优势。
手动统一算法?一般不需要,但可绕过
你无法直接让 Arrays.sort(int[]) 改用 Timsort,也不能强制 Arrays.sort(Integer[]) 用快排。若真有特殊需求(如舍弃稳定性换速度),可将 Integer[] 拆箱为 int[] 再排序,或自行实现快排;但多数业务场景下,JDK 的默认选择已是最优解。








