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. 從上圖可以看出排序有一個是否使用以前的排序方式,這個是1.8兼容1.6的排序方式;
  2. 不論是否實現了 Comparator接口,后續的排序都是使用了折半插入排序,但是在不同的類里面實現的,這個主要區別是比較的對象是否實現了Comparable接口;
  3. 1.6的排序方式是歸並排序,而1.7以后的是折半插入排序,至於為什么還沒有弄明白,估計是歸並排序的缺點才放棄的吧。雖然歸並排序很穩定,但是需要的輔助空間太大;那為什么選擇折半插入的原因可能是除了歸並之外的其他穩定排序的幾種方式里面快排不穩定,基數排序太特殊,但是堆排序個人感覺比折半還是好點,為什么沒用就不清楚了。
Arrays的具體實現大家可以看一下源碼,這里就不貼出來了。
     
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM