Contents

arrays.sort和arrays.parallelsort区别

1. 概述

我们都使用过*Arrays.sort()*对对象或基元数组进行排序。在 JDK 8 中,创建者增强了 API 以提供一种新方法:Arrays.parallelSort()

在本教程中,我们将比较*sort()parallelSort()*方法。

2. Arrays.sort()

*Arrays.sort()*方法对对象或基元数组进行排序。**此方法中使用的排序算法是 Dual-Pivot Quicksort 。**换句话说,它是快速排序算法的自定义实现,以实现更好的性能。 此方法是单线程的,有两种变体:

  • sort(array) – 将整个数组按升序排序
  • sort(array, fromIndex, toIndex) – 仅对从 fromIndextoIndex的元素进行排序

让我们看一下这两种变体的示例:

@Test
public void givenArrayOfIntegers_whenUsingArraysSortMethod_thenSortFullArrayInAscendingOrder() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    Arrays.sort(array);
    assertArrayEquals(expected, array);
}
@Test
public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
    Arrays.sort(array, 2, 8);
    assertArrayEquals(expected, array);
}

让我们总结一下这种方法的优缺点:

优点 缺点
在较小的数据集上快速工作 大型数据集的性能下降
未使用系统的多个核心

3. Arrays.parallelSort()

此方法还对对象或基元数组进行排序。与*sort()*类似,它也有两种变体来对完整数组和部分数组进行排序:

@Test
public void givenArrayOfIntegers_whenUsingArraysParallelSortMethod_thenSortFullArrayInAscendingOrder() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    Arrays.parallelSort(array);
    assertArrayEquals(expected, array);
}
@Test
public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 };
    Arrays.parallelSort(array, 2, 8);
    assertArrayEquals(expected, array);
}

*parallelSort()在功能上有所不同。与sort()*使用单个线程按顺序对数据进行排序不同,它使用并行排序合并排序算法。它将数组分解为子数组,这些子数组本身已排序然后合并。

为了执行并行任务,它使用ForkJoin池。

但我们需要知道它只有在满足某些条件时才使用并行性。如果数组大小小于或等于 8192 或处理器只有一个内核,则它使用顺序 Dual-Pivot Quicksort 算法。否则,它使用并行排序。

让我们总结一下使用它的优点和缺点:

优点 缺点
为大型数据集提供更好的性能 较小的阵列速度较慢
利用系统的多个核心

4. 比较

现在让我们看看这两种方法如何处理不同大小的数据集。以下数字是使用JMH 基准测试 得出的。测试环境使用AMD A10 PRO 2.1Ghz四核处理器和JDK 1.8.0_221:

数组大小 Arrays.sort() Arrays.parallelSort()
1000 o.048 0.054
10000 0.847 0.425
100000 7.570 4.395
1000000 65.301 37.998