一 問題的提出
關於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)
使用的是歸並排序,是穩定的.