为什么Java8有array.parallelSort()而没有Collections.parallelSort()?

为什么Java8有array.parallelSort()而没有Collections.parallelSort()?,java,multithreading,list,sorting,java-8,Java,Multithreading,List,Sorting,Java 8,Java8以重载方法的形式为数组的多线程排序引入了一种并行算法 为什么它不也提供一个集合。parallelSort(),用于对列表进行多线程排序?一个列表不一定能有效地实现与数组相同的并行排序算法。您可以将其直接应用于ArrayList,但很可能无法应用于LinkedList,因为它缺乏有效的随机访问。对于这类列表,有一些高效的多线程排序算法,但它们不同于随机访问列表 而且,事实上,List接口的线程安全实现可能根本不支持高效的外部多线程排序,这是由于同步。为它们提供一个通用的排序算法是不可能的

Java8以重载方法的形式为数组的多线程排序引入了一种并行算法


为什么它不也提供一个集合。parallelSort(),用于对
列表进行多线程排序?

一个
列表
不一定能有效地实现与数组相同的并行排序算法。您可以将其直接应用于
ArrayList
,但很可能无法应用于
LinkedList
,因为它缺乏有效的随机访问。对于这类列表,有一些高效的多线程排序算法,但它们不同于随机访问列表


而且,事实上,
List
接口的线程安全实现可能根本不支持高效的外部多线程排序,这是由于同步。为它们提供一个通用的排序算法是不可能的,事实上,并行算法在它们身上可能比顺序算法慢。

list.parallelStream().sorted().collect(…)
?列表的性质允许它们以不同的方式排序:很容易剪切和插入元素或整个升序“运行”从列表中的任意位置到任意位置。在数组中插入或删除需要在其后的每个元素上移动。因此,在数组的并行排序中,元素在其本地集群中排序,然后全局合并,但是没有理由将
列表
排序限制为相同的机制;这是一个基本原理问题,而不是操作问题。数组允许简单的并行排序,因为它们可以很容易地划分成块,线程可以独立处理这些块,并具有已知的数据访问性能特征,因此我们知道就地并行排序实际上是可行的。对于列表,我们不能保证就地并行排序是可行的。@BrianGoetz是的,我同意。我已经投票决定重新打开。@JeffreyBosboom对于数组以外的数据结构,就地排序充满了太多的“如果”和“可能”,因此很难确保良好的并行性。对于任意列表,可以使用
list.stream().sorted().collect(…)
。我理解有一个神奇的“列表并行排序”是多么有吸引力,但另一方面,没有人会对并行加速性能差的实现感到满意。因为列表是一个接口,而LinkedList的子级不能支持并行排序,因为这个答案,而ArrayList可以支持,由于此问题列表没有使用流的并行排序。所以我们需要做list.parallelStream().storted().collect(Collectors.toList());