背景(废话): 近期看到公司项目里面针对自定义对象进行排序的时候有一行代码:
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?
声明:文中涉及到参考别人文章的,都贴出了对应的跳转链接,感谢原作者分享,支持原创,如有侵权,请联系删除,谢谢。