Arrays.sort与Arrays.parallelSort区别
Arrays.sort()
Arrays.sort() 方法对对象或原始数据类型的数组进行排序。此方法中使用的排序算法是 Dual-Pivot Quicksort。 换句话说,它是快速排序算法的自定义实现,以实现更好的性能。
此方法是单线程的 ,有两种变体:
-
sort(array)–将整个数组按升序排序
-
sort(array, fromIndex, toIndex)–仅将从 fromIndex 到 toIndex 的元素排序
优点 |
缺点 |
快速处理较小的数据集 |
大型数据集的性能下降 |
|
没有利用系统的多个核心 |
Arrays.parallelSort()
此方法对对象或原始数据类型的数组进行排序。与 sort() 类似,它也有两个变体来对完整数组和部分数组进行排序
parallelSort() 在功能上有所不同。与 sort() 使用单个线程对数据进行顺序排序不同,它使用并行排序-合并排序算法。它将数组分成子数组,这些子数组本身先进行排序然后合并。
为了执行并行任务,它使用 ForkJoin 池。
但是我们需要知道,只有在满足某些条件时,它才会使用并行性。如果数组大小小于或等于 8192,或者处理器只有一个核心,则它将使用顺序的 Dual-Pivot Quicksort 算法。否则,它使用并行排序。
让我们总结一下使用它的优缺点:
优点 |
缺点 |
为大型数据集提供更好的性能 |
对于大小较小的数组,处理速度较慢 |
利用系统的多个核心 |
|
比较
现在,让我们看看在不同大小的数据集上两种方法怎样执行。以下数字是使用JMH 基准测试得出的。测试环境使用 AMD A10 PRO 2.1Ghz 四核处理器和 JDK 1.8.0_221:
数组大小 |
Arrays.sort() |
Arrays.parallelSort() |
1000 |
0.048 |
0.054 |
10000 |
0.847 |
0.425 |
100000 |
7.570 |
4.395 |
1000000 |
65.301 |
37.998 |
二、Arrays.binarySearch()方法使用
Arrays.binarySearch()方法与其名字一样,是一个二分查找的方法。
通过二分法查找已排序数组,并返回其下标。
private static int binarySearch0(long[] a, int fromIndex, int toIndex, long key) { int low = fromIndex; int high = toIndex - 1; while (low <= high) { int mid = (low + high) >>> 1; long midVal = a[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. }
- 当数组长度为奇数时,数组中有重复元素,Arrays.binarySearch()会优先返回奇数且靠近当前区间中间的下标
- 当数组长度为偶数时,数组中有重复元素,Arrays.binarySearch()会优先返回偶数且靠近当前区间中间的下标