jdk 1.8中的list排序
首先看看collections实现
public static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); } public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null); }
collections的实现可以看出,排序实现分为两种:是否实现了Comparator的接口
接下来看看list.sort的具体实现
default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } }
list的实现是通过Arrays的排序实现的,然后再通过遍历器将数据数据插入到原有的List当中去
接下来看看Array是的源码
Arrays的排序实现分为4种情况:
对上图几点说明:
-
从上图可以看出排序有一个是否使用以前的排序方式,这个是1.8兼容1.6的排序方式;
-
不论是否实现了Comparator接口,后续的排序都是使用了折半插入排序,但是在不同的类里面实现的,这个主要区别是比较的对象是否实现了Comparable接口;
-
1.6的排序方式是归并排序,而1.7以后的是折半插入排序,至于为什么还没有弄明白,估计是归并排序的缺点才放弃的吧。虽然归并排序很稳定,但是需要的辅助空间太大;那为什么选择折半插入的原因可能是除了归并之外的其他稳定排序的几种方式里面快排不稳定,基数排序太特殊,但是堆排序个人感觉比折半还是好点,为什么没用就不清楚了。
Arrays的具体实现大家可以看一下源码,这里就不贴出来了。