下面的答案与 OpenJDK 相关(对照 10.0.1 检查)。
Streams将排序操作委托给相关的Arrays.sort
方法(参见end
各种方法SortingOps
).
对对象流进行排序
对于对象排序,TimSort
(基本上,当输入的划分足够小时,使用插入排序的合并排序)是首选方法。
作者信用Tim Peter 在 Python 中实现列表排序作为灵感 http://svn.python.org/projects/python/trunk/Objects/listsort.txt,进一步将这个想法归因于论文"Optimistic Sorting and Information Theoretic Complexity", Peter McIlroy, SODA (Fourth Annual ACM-SIAM Symposium on Discrete Algorithms), 467-474, Austin, Texas, 25-27 January 1993
.
但是用户也可以请求MergeSort
(当数组足够小时,回退到插入排序 - 在 OpenJDK 10 中为 32 个或更少的元素)通过设置java.util.Arrays.useLegacyMergeSort
财产给true
。计划在未来版本中删除此内容。
对原语流进行排序
用于对基元流进行排序(byte
, char
, short
, int
, long
, float
, double
) - 实现了双枢轴快速排序。作者(弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和乔什·布洛赫)没有提供有关灵感来源的更多信息。
Sources
要了解更多信息,请参阅 OpenJDK 代码:
SortedOps.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/stream/SortedOps.java- 与流相关的实现
数组.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/Arrays.java- 实施Arrays
帮手看看不一样的sort
methods
TimSort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/TimSort.java- TimSort 的实现
比较TimSort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/ComparableTimSort.java- 类实施的变化Comparable
DualPivotQuicksort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/DualPivotQuicksort.java- 实现原语排序