java中排序原始碼分析(JDK1.8)
阿新 • • 發佈:2018-11-09
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詳解