java中arrays.sort对基本类型数组用双轴快排,对引用类型数组及collections.sort(本质调arrays.sort(object[]))均用timsort;算法由参数实际类型决定,非手动选择。

Java 中 Collections.sort 和 Arrays.sort 表面功能相似,但底层算法选择严格区分数据类型——不是按“用法”分,而是按“实际参数类型”自动分流。关键在于:基本类型数组与引用类型数组在 JVM 中内存布局和比较语义完全不同,因此 JDK 必须采用不同策略。
Arrays.sort 对基本类型用双轴快排(DualPivotQuicksort)
当传入 int[]、long[]、double[] 等基本类型数组时,Arrays.sort() 直接调用高度优化的 DualPivotQuicksort.sort()。它使用两个 pivot 划分三段,减少递归深度和比较次数,在平均场景下比传统快排快约 10%–20%。该实现不保证稳定性(对基本类型无意义),且小数组(长度 ≤ 47)会退化为插入排序以减少开销。
- 不接受
Comparator:基本类型没有对象引用,无法传入比较器 - 仅支持自然序(升序):因为基本类型无
Comparable接口,也没有重载逻辑 - 不能用于
List<integer></integer>:那是包装类,属于引用类型,走另一条路径
Arrays.sort 对引用类型用 TimSort
当参数是 String[]、Integer[]、MyObj[] 等引用类型数组时,Arrays.sort(T[]) 使用 TimSort —— 一种融合了归并排序与插入排序的稳定算法。它会检测数组中已有的有序片段(runs),对小段用二分插入排序,再逐层归并。特别适合部分有序或含重复元素的数据,最坏/平均时间复杂度均为 O(n log n),且保持相等元素的相对顺序。
- 支持
Comparator重载:通过Arrays.sort(arr, comparator)自定义逻辑 - 要求元素可比:要么实现
Comparable,要么提供显式Comparator - 数组必须非 null,且元素间能相互比较,否则抛
ClassCastException
Collections.sort 只作用于 List,底层仍调 Arrays.sort
Collections.sort(List<t>)</t> 本身不实现排序逻辑,而是把 List 转成 Object 数组,再调用 Arrays.sort(Object[])。所以它**永远走 TimSort 路径**,和引用类型数组一致。它不处理基本类型集合(如 int 无法存入 List<int></int>),所有合法输入都是引用类型。
- 输入必须是
List实现(如ArrayList、LinkedList) - 内部转换为数组后排序,再把结果拷回原 List —— 原地修改,不新建 List
- 同样支持
Comparator重载,且默认要求元素实现Comparable
常见误区澄清
有人以为 “Collections.sort 用归并排序,Arrays.sort 用快排”,这是过时理解(JDK7 以前)。从 JDK7 开始,二者对引用类型都统一用 TimSort;对基本类型,只有 Arrays.sort 支持,且固定用双轴快排。不存在“选哪个更快”的通用答案——类型决定了算法,不是开发者手动选择。
-
Arrays.sort(new int[]{...})→ 双轴快排 -
Arrays.sort(new Integer[]{...})→ TimSort -
Collections.sort(Arrays.asList(...))→ TimSort(因生成的是List<integer></integer>) - 没有
Collections.sort处理int的可能:语法不合法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











