jdk 1.8中的list排序
阿新 • • 發佈:2019-01-02
首先看看collections實現
collections的實現可以看出,排序實現分為兩種:是否實現了Comparator的介面
接下來看看list.sort的具體實現
接下來看看Array是的原始碼 Arrays的排序實現分為4種情況: 對上圖幾點說明:
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); }
接下來看看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以後的是折半插入排序,至於為什麼還沒有弄明白,估計是歸併排序的缺點才放棄的吧。雖然歸併排序很穩定,但是需要的輔助空間太大;那為什麼選擇折半插入的原因可能是除了歸併之外的其他穩定排序的幾種方式裡面快排不穩定,基數排序太特殊,但是堆排序個人感覺比折半還是好點,為什麼沒用就不清楚了。