`
m635674608
  • 浏览: 5087651 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程

    博客分类:
  • java
 
阅读更多

Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程。所有的开发者都会用到Arrays.sort来进行对象和原生数组进行排序,这个API会使用归并排序或者Tim排序来进行排序,源码如下所示:

1
2
3
4
5
6
public static void sort(Object[] a) {
  if (LegacyMergeSort.userRequested)
    legacyMergeSort(a);
  else
    ComparableTimSort.sort(a);
}

上面的代码会依次执行,技术归并排序使用了分治的技术。Java8出来之后,有一个新API用来进行排序,这就是 Arrays.ParallelSort,这是一种并行排序,有意思吧,让我们来看看它是怎么实现的。 Arrays.ParallelSort使用了Java7的Fork/Join框架使得排序任务可以在现场池中的多个线程中进行,Fork/Join实现 了一种任务窃取算法,一个闲置的线程可以窃取其他线程的闲置任务进行处理。

Arrays.parallelSort概述

这个方法使用了一个临界值,还有一些容量小于这个临界值的数组,这个临界值和数组的容量都是计算来用于并行计算的,如下代码所示:

1
2
3
4
5
private static final int getSplitThreshold(int n) {
  int p = ForkJoinPool.getCommonPoolParallelism();
  int t = (p > 1) ? (1 + n / (p << 3)) : n;
  return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t;
}

一旦数组决定了使用并行排序,那他马上会被分为几个部分,然后通知Fork/Join任务对各个部分进行排序,跟着通知另外的Fork/Join任 务对排序后的数组进行合并。Java8使用如下的方法进行实现: 1、将数组分成4个子数组。 2、对前面两个子数组进行排序然后合并。 3、对后面的两个进行排序然后合并。 上面着几个步骤会重复递归,每个子数组都要求容量小于上面计算出来的临界值。

一些有意思的结果

我尝试去对比Arrays.sort和Arrays.parallelSort的排序时间,在一台4CPU的电脑上,使用如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ArraysParallelDemo {
  public static void main(String[] args) throws FileNotFoundException {
    List<Double> arraySource = new ArrayList<>();
    Scanner reader = new Scanner(ClassLoader.
        getSystemResourceAsStream("java8demo/large_array_input"));
    while(reader.hasNext()){
      String line = reader.nextLine();
      String[] strNums = line.split(",");
      for ( String strN : strNums){
          arraySource.add(Double.parseDouble(strN));
      }
    }
    System.out.println(arraySource.size());
    Double [] myArray = new Double[1];
    myArray = arraySource.toArray(myArray);
    long startTime = System.currentTimeMillis();
    Arrays.sort(myArray);
    long endTime = System.currentTimeMillis();
    System.out.println("Time take in serial: "+
        (endTime-startTime)/1000.0);
    Double [] myArray2 = new Double[1];
    myArray2 = arraySource.toArray(myArray);
    startTime = System.currentTimeMillis();
    Arrays.parallelSort(myArray2);
    endTime = System.currentTimeMillis();
    System.out.println("Time take in parallel: "+
        (endTime-startTime)/1000.0);
  }
}

数组容量和时间消耗的一个基准测试如下所示:


在数组容量小于10000的情况下,并行排序和串行排序消耗时间是差不多的,但是当数组容量在10000以上的时候,并行排序就体现出了它的优势。

分享到:
评论

相关推荐

    Why java Arrays use two different sort algorithms for different types?

    在Java编程语言中,`Arrays`类提供了多种排序方法,如`sort()`,用于对不同数据类型(如整型、浮点型、字符型以及对象)的数组进行排序。标题"为什么Java Arrays针对不同类型的数组使用两种不同的排序算法?"揭示了...

    Java实现类排序

    在Java 8及以上版本,我们可以使用lambda表达式简化`Comparator`的创建: ```java Arrays.sort(people, (p1, p2) -&gt; p1.getName().compareTo(p2.getName())); Collections.sort(personList, (p1, p2) -&gt; p1.getName...

    JAVA 对象数组按照多个属性进行排序

    本文将深入探讨如何在Java中实现这个功能,结合给出的标签“源码”和“工具”,我们将讨论标准库中的`Comparator`接口和`Collections.sort()`方法,以及自定义比较逻辑。 首先,了解Java中的`Comparable`和`...

    java中的Arrays这个工具类你真的会用吗(一文秒懂)

    Java中的`Arrays`工具类是Java Collections Framework的一部分,位于`java.util`包下,它提供了一系列静态方法,用于处理各种类型的数组,包括排序、搜索、拷贝和比较等操作。这个类的设计目的是为了方便和高效地...

    Java SE 8 for the Really Impatient 写给大忙人看的Java SE 8 源码

    通过本书的源码,读者可以深入理解以上特性在实际代码中的应用,体验Java 8带来的编程效率提升。学习时,应结合具体代码实例,动手实践,以达到最佳学习效果。此外,理解这些新特性的背后设计理念,对于成为一名优秀...

    java 相关问题(二)

    例如,对于大数据量,可能需要考虑使用并行排序,如`Arrays.parallelSort()`。 7. **文件操作**: - 压缩包子文件"Java类排序.doc"可能是关于类排序的文档资料,阅读此类文档可以帮助我们更深入地了解Java类排序的...

    学习java源码,java1.8

    其次,Java 8引入了方法引用来代替Lambda,可以引用类的方法或实例方法。方法引用的语法如下: ```java List&lt;String&gt; list = Arrays.asList("a", "b", "c"); list.sort(String::compareTo); // 使用方法引用来排序 ...

    java jdk 实例宝典源码

    Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...

    LambdaInAction-源码.rar

    在Java 8中,Lambda表达式是函数式接口的一种实例化方式,它允许我们将匿名函数作为参数传递,或者作为一个返回值。Lambda表达式的语法结构如下: ``` 参数列表 -&gt; 表达式或代码块 ``` 例如,一个简单的Lambda...

    Java对象排序、中文排序、SortedSet排序使用和源码讲解

    Java中的排序机制主要依赖于内置的排序函数,如`Collections.sort()`和`Arrays.sort()`,它们简化了编程过程,避免了直接操作底层数据结构。在Java中,对象排序主要是通过对象实现`Comparable`接口或者使用自定义的`...

    java8 lambda表达式学习总结

    3. **方法引用**:当Lambda体完全等同于某个已存在的方法时,可以使用方法引用来替代Lambda表达式,如 `Arrays.sort(list, Comparator.comparingInt(Integer::intValue))`。 4. **构造器引用**:同样,Lambda 表达式...

    java实例18个

    8. **集合框架**:Java集合框架提供了多种数据结构(如ArrayList, LinkedList, HashMap等),实例可能演示如何使用它们存储和操作数据。 9. **字符串处理**:String类是Java中常用的,实例可能会展示如何创建、修改...

    JavaSE基础篇 -- jdk配置,数组及其应用,栈和堆内存图解(Java源码)

    此外,Java提供了多种数组操作,如System.arraycopy()用于复制数组部分,Arrays.sort()进行排序,以及Arrays.equals()比较两个数组是否相等。 栈和堆是Java内存管理中的两个关键区域。栈主要用于存储局部变量、方法...

    java 常用工具类

    在Java标准库中,`java.util`包就包含了大量常用的工具类,如`Arrays`、`Collections`和`Date`等。在自定义开发中,我们也会创建类似的工具类来封装重复性的代码。 标题“java 常用工具类”暗示我们将探讨Java编程...

    Sorted Java

    - 当元素类型不支持自然顺序或者需要按照特定规则排序时,可以提供一个Comparator实例给`Arrays.sort()`或`Collections.sort()`,通过重写`compare()`方法来定制排序逻辑。 5. **排序算法**: - Java中虽然内置了...

    javajdk源码-java8-source-code-learning:Java8JDK源代码分析

    Java 8 JDK源代码分析是深入理解Java编程语言的关键步骤,因为源代码揭示了语言的内部工作机制。在本文中,我们将探讨Java 8中的主要新特性,并通过源代码解析来理解这些特性的实现原理。 1. **Lambda表达式**: ...

    openjdk-8-源码-少积分

    例如,`Arrays.sort(list, String::compareTo)`,这比使用Lambda更清晰且高效。 4. **流API(Stream API)**:Stream API是Java 8的一个重大改进,它提供了一种声明式处理数据集合的方式。流可以来自集合、数组或者...

    Java的一些工具类

    自Java 8起,`java.time`包中的`LocalDate`, `LocalTime`, 和 `LocalDateTime`等类提供了更现代、易用的日期时间API。 4. **HashMap和HashSet**: 这些是`java.util`包中实现Map和Set接口的常见工具类,提供了键值对...

    java数组

    Arrays.sort(numbers); // 对numbers数组进行升序排序 ``` 八、数组的拷贝 `System.arraycopy()`方法用于高效地复制数组的一部分或全部到另一个数组: ```java int[] copy = new int[numbers.length]; System....

    java排序Comparator和Comparable

    使用`Comparator`排序时,可以传递给`Collections.sort()`或`Arrays.sort()`方法,例如: ```java List&lt;MyObject&gt; list = ...; Collections.sort(list, new MyComparator()); ``` 此外,`Comparator`还可以通过...

Global site tag (gtag.js) - Google Analytics