本文由@牛旦教育IT课堂原创翻译
原文:https://www.baeldung.com/java-arrays-sort-vs-parallelsort
0.摘要
我们都用过Array.sort()来对对象或基本类型数组进行排序。在JDK 8中,增强的API来提供一个新方法:Arrays.parallelSort()。
本教程中,我们来比较sort()和parallelSort()方法的具体情况。
![a3679fc717b439074e6971a7dea39228.png](https://img-blog.csdnimg.cn/img_convert/a3679fc717b439074e6971a7dea39228.png)
1.Arrays.sort()
Arrays.sort()方法对数组对象或基本类型排序,其基本算法是Dual-Pivot Quicksort(对称快速排序)。换句话说,它是快速排序算法的自定义实现,以获得更好的性能。
这个方法是单线程的,它有两个辩题方法:
- l sort(array) – 将整个数组按升序排序
- l sort(array, fromIndex, toIndex) – 只对从fromIndex到toIndex的元素排序
来看两个变体方法的代码示例:
@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);
}
简要总结一下这种方法的利弊:
![9569ba2f96aae1661bb2241a1c91bbe9.png](https://img-blog.csdnimg.cn/img_convert/9569ba2f96aae1661bb2241a1c91bbe9.png)
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()不同,它使用并行的sort-merge(合并排序)算法。它将数组拆分成子数组,子数组本身进行排序,然后合并。
对于执行的并行任务,它使用ForkJoin池。
但是我们要知道,它只在满足特定条件时才使用并行特性。如果数组大小小于或等于8192,或者处理器只有一个核心,那么它使用顺序Dual-Pivot快速排序算法。否则,它使用并行排序。
总结一下此种排序的利弊:
![84e09311f95baea6333509288ccf8a67.png](https://img-blog.csdnimg.cn/img_convert/84e09311f95baea6333509288ccf8a67.png)
两者比较
现在让我们看看这两个方法在不同大小的数据集上是如何执行的。下面的数字是使用JMH基准(https://www.baeldung.com/java-microbenchmark-harness)测试得出的。测试环境使用AMD A10 PRO 2.1Ghz四核处理器和JDK 1.8.0_221:
![4be53c1b4cd01c24d7aa54158918f36c.png](https://img-blog.csdnimg.cn/img_convert/4be53c1b4cd01c24d7aa54158918f36c.png)
方法性能测试对照
总结
本篇短文中,我们了解了sort()和parallelSort()的区别。
根据性能结果,我们可以得出结论,当需要对大型数据集进行排序时,parallelSort()可能是更好的选择。但是,对于较小大小的数组,最好使用sort(),因为它提供了更好的性能。
好了,本就到这里,各位具体使用中,根据自己的实际需要取舍吧。
点个赞,分享出去吧。^_^