1. 程式人生 > >java中排序原始碼分析(JDK1.8)

java中排序原始碼分析(JDK1.8)

List排序

在開發過程中常用的是jdk自帶的排序

Collections.sort(List<T> list, Comparator<? super T> c);

開啟原始碼如下:

@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
   list.sort(c);
}

也就說可以直接呼叫list.sort©進行排序,那麼list的sort方法是如何實現排序的,繼續看原始碼ArrayList 的sort實現

  @Override
    @SuppressWarnings("unchecked")
    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

ArrayList的底層是陣列,通過 Arrays.sort()對陣列進行排序

陣列排序

Arrays.sort(T[] a, Comparator<? super T> c);
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

當Comparator == null時,呼叫sort(a, fromIndex, toIndex);如下

 public static void sort(Object[] a, int fromIndex, int toIndex) {
        rangeCheck(a.length, fromIndex, toIndex);
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, fromIndex, toIndex);
        else
            ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0);
    }

在jdk1.8中LegacyMergeSort.userRequested是false,可以通過System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
強制使用legacyMergeSort排序,目的是為了相容低版本

TimSort是結合了合併排序(合併排序)和插入排序(插入排序)而得出的排序演算法,它在現實中有很好的效率

由此可知:ArrayList和陣列是用過 ComparableTimSort.sort()和 TimSort.sort()實現排序的。

參考部落格:
MergeSort與TimSort,ComparableTimSort
Timsort詳解
ComparableTimSort詳解