关于Java中Collections.sort和Arrays.sort的稳定性问题
Posted Dybala21
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java中Collections.sort和Arrays.sort的稳定性问题相关的知识,希望对你有一定的参考价值。
一 问题的提出
??关于Java
中Collections.sort
和Arrays.sort
的使用,需要注意的是,在本文中,比较的只有Collections.sort(List<T> elements)
和Arrays.sort(int[] var0)
.
??对这个问题产生兴趣是因为这两者使用的时候稳定性是有差异的,那么稳定性究竟为什么有差异呢?刚开始令我好奇的是Collections.sort
的源码中竟然也使用到了Arrays.sort
.
二 代码分析
??Arrays.sort
的源代码如下
public static void sort(int[] var0) {
DualPivotQuicksort.sort(var0, 0, var0.length - 1, (int[])null, 0, 0);
这里的DualPivotQuicksort
其实就是对传统的快排算法进行改进的快排,区别就是将数组切成了三段.
??Collections.sort
的源代码如下
default void sort(Comparator<? super E> var1) {
Object[] var2 = this.toArray();
Arrays.sort(var2, var1);
ListIterator var3 = this.listIterator();
Object[] var4 = var2;
int var5 = var2.length;
for(int var6 = 0; var6 < var5; ++var6) {
Object var7 = var4[var6];
var3.next();
var3.set(var7);
}
}
这里会明显看见调用了Arrays.sort
,但是只要到Arrays
中去仔细看,会发现其实是不同的.
public static <T> void sort(T[] var0, Comparator<? super T> var1) {
if (var1 == null) {
sort(var0);
} else if (Arrays.LegacyMergeSort.userRequested) {
legacyMergeSort(var0, var1);
} else {
TimSort.sort(var0, 0, var0.length, var1, (Object[])null, 0, 0);
}
}
到了这里,其实大致也就清楚了,对于TimSort.sort
其实就是一个相对于legacyMergeSort
性能更加好的归并排序.
三 总结
对于Arrays.sort(int[] var0)
使用的是快排,所以是不稳定的.
对于Collections.sort(List<T> elements)
使用的是归并排序,是稳定的.
以上是关于关于Java中Collections.sort和Arrays.sort的稳定性问题的主要内容,如果未能解决你的问题,请参考以下文章
Java:Collections.sort和Arrays.sort的区别
java Collections.sort()实现List排序的默认方法和自定义方法
java中排序函数sort()使用,Arrays.sort()和Collections.sort()