背景(廢話): 近期看到公司項目裡面針對自定義對象進行排序的時候有一行代碼:
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true")
Collections.sort(list, new XxxxComparator()); //list:要排序的對象集合,new XxxxComparator()自定義的排序對象
于是,我就對這個找了點資料看看。
正題:
比較自定義對象的大小,正常按照其屬性去比較。比如student類的對象,可以根據age屬性排序啊之類的。
一般,Java中通過接口實作兩個對象的比較,比較常用就是:Comparable接口和Comparator接口。
1.Comparable接口強制進行自然排序,而Comparator接口不強制進行自然排序,可以指定排序順序。
compareTo(T t)方法 compare(T t1 ,T t2)方法
實體類裡面實作 可以獨立重寫排序類實作
Collections.sort(list); Collections.sort(list, 自定義實作類對象);
2.Collections.sort的底層是轉換成資料,再調用Arrays.sort();
Arrays.sort()源碼實作: legacyMergeSort 和 TimeSort,代碼:
public static <T> void sort(T[] a, Comparator<? super T> c){
if(LegacyMergeSort.userRequested){ //此處就是判斷是否使用經典的歸并排序(在jdk1.7以後預設的排序更改為了
//TimSort算法排序)。 //上面System.setProperty(..,true)的值,源碼如下:
legacyMergeSort(a, c);
}
TimeSort.sort(a, c);
}
static final class LegacyMergeSort {
private static final boolean userRequested =
java. security .AccessController . doPrivileged(
new sun. security . action. GetBooleanAction(
S: "java.util.Arrays .useLegacyMergeSort")) . booleanValue();
}
舊的排序方式為legacyMergeSort,新的為TimSort,如果要用舊的排序方式,可以在系統屬性中加上 java.util.Arrays.useLegacyMergeSort=true 這個參數。
3.關于并歸排序legacyMergeSort,可以看看 深入了解java源碼 mergeSort實作 【有歸并排序過程圖,這個比較好了解 】
4.關于TimSort算法,是一種起源于歸并排序和插入排序的混合排序算法(原則上TimSort是歸并排序,但小片段的合并中用了插入排序)
可以看看 https://www.zhihu.com/question/23928138
還想深入看看Timesort的,推薦一篇文章: 如何找出Timsort算法和玉兔月球車中的Bug?
聲明:文中涉及到參考别人文章的,都貼出了對應的跳轉連結,感謝原作者分享,支援原創,如有侵權,請聯系删除,謝謝。