Java Arrays和Collections的sort()方法源碼分析


Java Arrays和Collections的sort()方法源碼分析

Arrays:

Collections:

Arrays : 是對數組進行排序;

Collections :是對列表進行排序;

1 @SuppressWarnings("unchecked")
2     public static <T extends Comparable<? super T>> void sort(List<T> list) {
3         list.sort(null);
4     }

我們在索引進去: Ctrl + 左鍵;

 1 @SuppressWarnings({"unchecked", "rawtypes"})
 2     default void sort(Comparator<? super E> c) {
 3         Object[] a = this.toArray();
 4         Arrays.sort(a, (Comparator) c);
 5         ListIterator<E> i = this.listIterator();
 6         for (Object e : a) {
 7             i.next();
 8             i.set((E) e);
 9         }
10     }

原來在Collections中底層是調用了 Arrays.sort() 方法;

而Arrays.sort()方法中:

 1 public static <T> void sort(T[] a, Comparator<? super T> c) {
 2         if (c == null) {
 3             sort(a);
 4         } else {
 5             if (LegacyMergeSort.userRequested)
 6                 legacyMergeSort(a, c);
 7             else
 8                 TimSort.sort(a, 0, a.length, c, null, 0, 0);
 9         }
10     }
11 
12     /** To be removed in a future release. */
13     private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
14         T[] aux = a.clone();
15         if (c==null)
16             mergeSort(aux, a, 0, a.length, 0);
17         else
18             mergeSort(aux, a, 0, a.length, 0, c);
19     }
 1 public static void sort(Object[] a) {
 2         if (LegacyMergeSort.userRequested)
 3             legacyMergeSort(a);
 4         else
 5             ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
 6     }
 7 
 8     /** To be removed in a future release. */
 9     private static void legacyMergeSort(Object[] a) {
10         Object[] aux = a.clone();
11         mergeSort(aux, a, 0, a.length, 0);
12     }

終於:

 1     @SuppressWarnings({"unchecked", "rawtypes"})
 2     private static void mergeSort(Object[] src,
 3                                   Object[] dest,
 4                                   int low,
 5                                   int high,
 6                                   int off) {
 7         int length = high - low;
 8 
 9         // Insertion sort on smallest arrays
10         if (length < INSERTIONSORT_THRESHOLD) {
11             for (int i=low; i<high; i++)
12                 for (int j=i; j>low &&
13                          ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
14                     swap(dest, j, j-1);
15             return;
16         }
17 
18         // Recursively sort halves of dest into src
19         int destLow  = low;
20         int destHigh = high;
21         low  += off;
22         high += off;
23         int mid = (low + high) >>> 1;
24         mergeSort(dest, src, low, mid, -off);
25         mergeSort(dest, src, mid, high, -off);
26 
27         // If list is already sorted, just copy from src to dest.  This is an
28         // optimization that results in faster sorts for nearly ordered lists.
29         if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {
30             System.arraycopy(src, low, dest, destLow, length);
31             return;
32         }
33 
34         // Merge sorted halves (now in src) into dest
35         for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
36             if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)
37                 dest[i] = src[p++];
38             else
39                 dest[i] = src[q++];
40         }
41     }

所以,事實上Collections.sort方法底層就是調用的Arrays.sort方法,而Arrays.sort使用了兩種排序方法,快速排序和優化的歸並排序。快速排序主要是對那些基本類型數據(int,short,long等)排序, 而歸並排序用於對Object類型進行排序。

 


免責聲明!

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



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