关于对象集合的排序: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  void sort(T[] a, Comparator 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?

声明:文中涉及到参考别人文章的,都贴出了对应的跳转链接,感谢原作者分享,支持原创,如有侵权,请联系删除,谢谢。

你可能感兴趣的:(java基础,java,集合排序)