Java中Arrays.sort()对引用类型数组默认采用双轴快速排序,要求元素实现Comparable接口或传入Comparator,该算法从Java 7起启用,具备O(n log n)平均时间复杂度且无需手动开启。

Java 中 Arrays.sort() 对引用类型数组默认采用的是**双轴快速排序(Dual-Pivot Quicksort)**,这是从 Java 7 开始引入的优化算法(由 Vladimir Yaroslavskiy 等人提出),它比传统单轴快排在多数场景下更高效,尤其对中等规模数据有更好性能和更稳定的 O(n log n) 平均时间复杂度。
确保元素实现了 Comparable 接口
对引用类型数组使用 Arrays.sort(arr) 的前提是:数组中每个元素所属的类必须实现 Comparable 接口,并正确重写 compareTo() 方法。否则运行时会抛出 ClassCastException。
- 例如:
String[]、Integer[]、LocalDate[]都天然支持,因为它们已实现Comparable; - 自定义类如
Person[]需显式实现:
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // 按年龄升序
}
}
之后即可直接调用:
Person[] people = {new Person("Alice", 30), new Person("Bob", 25)};
Arrays.sort(people); // ✅ 使用双轴快排,按 age 升序
使用 Comparator 自定义排序逻辑
若不想修改类定义,或需多种排序方式(如按姓名降序),可传入 Comparator 实现:
立即学习“Java免费学习笔记(深入)”;
- 使用 Lambda 表达式(推荐):
Arrays.sort(people, (p1, p2) -> p1.getName().compareTo(p2.getName())); // 按姓名升序
- 使用方法引用或静态比较器:
Arrays.sort(people, Comparator.comparing(Person::getName).reversed()); // 姓名降序
注意:无论是否传 Comparator,Java 对引用类型仍默认启用双轴快排——该策略由 JVM 内部决定,开发者无需手动切换。
双轴快排不是“可选开关”,而是默认行为
你**不需要也不应该**手动指定“启用双轴快排”。只要满足以下条件,JVM 就自动使用它:
- 数组是引用类型(如
Object[]及其子类数组); - 数组长度 ≥ 47(阈值可变,JDK 实现细节,通常不用关心);
- 未使用
ParallelSort或其他替代 API。
对比说明:
-
Arrays.sort(int[])→ 使用的是 **Timsort 的变种(针对基本类型优化的归并排序)**; -
Arrays.sort(Integer[])→ 引用类型 → **双轴快排**; -
Arrays.parallelSort(...)→ 无论引用/基本类型,都可能转为并行归并排序(ForkJoin)。
注意事项与常见误区
-
稳定性:双轴快排是不稳定排序(相等元素的相对位置可能改变),如需稳定,请改用
Collections.sort()(底层为 Timsort)或自行封装; -
null 值:若数组含
null,且compareTo()或Comparator未处理,会抛NullPointerException;建议提前过滤或使用Comparator.nullsFirst(); - 性能提示:双轴快排最坏情况仍是 O(n²),但实践中极难触发(依赖输入分布),无需主动规避;
-
不可用于基本类型数组:如
int[]调用sort()走的是另一套路径,不涉及双轴逻辑。


















