天天看點

關于對象集合的排序:seLegacyMergeSort

背景(廢話): 近期看到公司項目裡面針對自定義對象進行排序的時候有一行代碼:

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?

聲明:文中涉及到參考别人文章的,都貼出了對應的跳轉連結,感謝原作者分享,支援原創,如有侵權,請聯系删除,謝謝。