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()会优先返回偶数且靠近当前区间中间的下标

 

posted on 2023-04-11 19:35  yuluoxingkong  阅读(142)  评论(0编辑  收藏  举报