java中的Arrays这个工具类你真的会用吗 (3)

部分的测试的结果:

=======================测试排序的时间========= Capacity1000 ParallelSort6.284099999999999E-4 Sort5.599599999999999E-4 比较快的排序是:Sort =======================测试排序的时间========= Capacity5000 ParallelSort0.00163599 Sort0.0018313699999999995 比较快的排序是:ParallelSort

可以看到在数据量比较小的情况下,使用sort()方法更快,一旦过了一个阈值,就是ParallelSort()这个方法性能好。这个阈值是多少呢。

我们先看一下parallelSort的源码:

public static void parallelSort(int[] a) { int n = a.length, p, g; if (n <= MIN_ARRAY_SORT_GRAN || (p = ForkJoinPool.getCommonPoolParallelism()) == 1) DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0); else new ArraysParallelSortHelpers.FJInt.Sorter (null, a, new int[n], 0, n, 0, ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ? MIN_ARRAY_SORT_GRAN : g).invoke(); }

可以看到当数组的长度小于MIN_ARRAY_SORT_GRAN或者p = ForkJoinPool.getCommonPoolParallelism()) == 1 (在单线程下)的时候,调用sort()排序的底层实现的DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);Arrays的开头定义的常量如下:

private static final int MIN_ARRAY_SORT_GRAN = 1 << 13; // 这个值是8192

对比两者,也就是在数组的长度比较大或者是多线程的情况下,优先考虑并行排序,否则使用串行排序。

两个排序的核心思想:

sort()方法的核心还是快排和优化后的归并排序, 快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。

parallelSort()它使用并行排序-合并排序算法。它将数组分成子数组,这些子数组本身先进行排序然后合并。

由于并行排序和串行排序的底层比较复杂,且篇幅有限,想要详细了解底层实现的话,可以移步到串行排序和并行排序

3.6 toString方法

基本用法:

@Test public void toStringTest(){ int[] array = {1,3,2,5}; System.out.println(Arrays.toString(array)); }

结果:

[1, 3, 2, 5]

源码分析如下:

public static String toString(int[] a) { // 1.判断数组的大小 if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; // 2.使用StringBuilder进行追加 StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) { b.append(a[i]); if (i == iMax) return b.append(']').toString(); b.append(", "); } }

具体的实现,已在源码的注释中进行了说明。这个方法对于基本数据类型来说,很方便的遍历数组。

追本溯源,方能阔步前行。 参考资料

https://blog.csdn.net/ExcellentYuXiao/article/details/52344628

sakuraTears的博客

javaSE的官方问档。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggwxs.html