arrays.parallelsort() 仅在数组长度≥10⁴且为int[]、double[]等基本类型时显著快于arrays.sort(),小数组(

Java 8 引入的 Arrays.parallelSort() 能自动利用多核 CPU 并行排序大数组,但效果取决于数组大小、类型和 JVM 运行环境,并非所有场景都比 Arrays.sort() 快。
何时真正受益于 parallelSort
并行排序只有在数据量足够大时才体现优势。JVM 内部设定了阈值(通常约 8192 个元素),小数组仍走串行快排路径;同时,CPU 核心数越多、数组越规整(如基本类型、无复杂对象比较逻辑),加速越明显。
- 推荐对长度 ≥ 10⁴ 的
int[]、double[]、long[]等基本类型数组使用 - 对象数组(如
String[]或自定义类)需确保Comparator轻量且无副作用,否则线程安全与性能可能受影响 - 若数组已基本有序,串行快排可能更快,并行拆分反而增加开销
基本用法与类型支持
Arrays.parallelSort() 提供多个重载方法,覆盖基本类型、对象数组及自定义比较器:
-
Arrays.parallelSort(int[] a)—— 基本类型直接排序 -
Arrays.parallelSort(String[] a)—— 对象数组(要求元素实现Comparable) -
Arrays.parallelSort(persons, Comparator.comparing(p -> p.age))—— 自定义比较逻辑
注意:不支持 boolean[]、char[] 等部分基本类型(它们没有对应重载),需转为包装类或改用串行方式。
实际调用注意事项
并行排序会使用 ForkJoinPool.commonPool(),其并行度默认为 Runtime.getRuntime().availableProcessors() - 1。若应用本身大量使用 commonPool,可能引发资源争抢:
- 可通过 JVM 参数调整:
-Djava.util.concurrent.ForkJoinPool.common.parallelism=4 - 避免在高并发 Web 请求中对小数组频繁调用,防止线程池任务堆积
- 排序过程不保证稳定性(相同元素相对位置可能变化),若需稳定排序,仍应选
Arrays.sort()(对对象数组是稳定的)
简单对比验证示例
可写一段基准测试粗略观察差异:
int[] arr = new int[1_000_000];
Random rnd = new Random();
for (int i = 0; i long t1 = System.nanoTime();
Arrays.parallelSort(arr);
long t2 = System.nanoTime();
System.out.println("parallelSort: " + (t2 - t1) / 1_000_000.0 + " ms");
运行多次取平均值,并关闭 JVM 预热干扰(或使用 JMH)。通常在百万级整型数组上,parallelSort 比串行快 1.5–3 倍,具体取决于硬件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











