首先注意這里調用sort方法的是Collections
類,他是集合框架中的一員,其中實現了大量的工具方法,有時間可以自行查看:
下面是一個簡單的測試類:
import java.util.*;/** * Created by Admin on 2017/3/7. */public class CollectionTest { public static void main(String[] args){ List<Integer> list_1 = new ArrayList<Integer>(Arrays.asList(2,1,4,8,5)); System.out.其中創建了一個ArrayList實例去測試sort()方法,執行結果如下:開始進入正題,我們首先查看Collections中sort方法的源代碼:
public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null);//傳入參數還可以是一個Comparator對象,但是也有一定的要求 }其中牽扯了許多泛型,T表示要排序的序列中的包含類型,這里出現了一個要求,類型 T 必須實現 Comparable 接口,public final class Integer extends Number implements Comparable<Integer>
,并且這個接口的類型是 T 或 T 的任一父類。這樣聲明后,T 的實例之間,T 的實例和它的父類的實例之間,可以相互比較大小。傳入的參數為List類型。
這樣,我們又開始查看List
中的sort方法,只是為了讓排序能繼續進行,對數據類型進行 一些處理:
再次進入Arrays類的sort,此處傳入的參數是Object的:
public static void sort(Object[] a) { //如果符合要求,直接對序列進行歸并排序操作(legacyMergeSort),最后的歸并排序代碼可以自己看一下,我就不貼了 //private static void mergeSort(Object[] src,Object[] dest,int low,int high,int off) if (LegacyMergeSort.userRequested) legacyMergeSort(a); else //否則,進入下一環節 ComparableTimSort.sort(a, 0, a.length, null, 0, 0); }在1.7之后,不再默認使用歸并排序,LegacyMergeSort.userRequested
被默認為false,也可以通過來更換
所以再再進入ComparableTimSort
的sort(),別急,馬上就完! 傳入參數數組a,lo與hi為要執行排序序列的開始與結束位置,work是一個備用的空間,可以為其設置屬性,在上面方法的調用中,我們并沒有使用到work
其中使用的二分查找與合并等種種過程,根據一個個條件優化操作。精華的地方慢慢品吧。稍后添加!
新聞熱點
疑難解答