標籤:
面試中被問到,集合類中的排序方法是怎麼實現的?沒有回答上來,故而總結如下:你知道嗎?
前提:在eclipse中對於自己的代碼可以通過按住Ctrl的同時單擊名稱跳入相應源碼中。但eclipse預設沒有添加java原始碼目錄,比如點擊Thread會提示source not found,而在開發中瞭解Java原始碼又是技術成長必要的。jdk預設是附帶源碼zip包的(jdk按裝目錄下的src.zip檔案),我們可以通過添加源碼在eclipse中查看。在提示source not found介面,點擊Attach Source…->External File,在jdk目錄下選擇src.zip即可。(jdk目錄可以在系統變數%JAVA_HOME%中查看)。
首先,代碼如下:
import java.util.*;
public class Sort {
public static void main(String args[]){
List list = new ArrayList();
list.add(123); list.add(321); list.add(87);
Collections.sort(list);
for(int i = 0;i <list.size();i++){
System.out.println(list.get(i));
}
}
}
輸出:
87
123
321
然後,我們來查看Collections.sort()方法,跳轉到的代碼如下:
public class collections{
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
}然後,我們點擊list.sort()方法,跳轉如下:
public interface List<E> extends Collection<E>{
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) { //jdk 1.8中新特性,介面中可以寫方法實體,在方法前加default.
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
}然後,產生了疑問,在Collection.sort()方法中,list.sort(null)傳入的是NULL,但是在list.sort()函數中,參數是default void sort(Comparator<? super E> c),然後ctrl點擊Comparator,
然後,我們看到調用了Arrays.sort()方法,進入這個Arrays.sort()方法中,
public class Arrays{
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);
}
}
}進入TimeSort.sort()方法:
class TimeSort{
static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c, T[] work, int workBase, int workLen) {
assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;
int nRemaining = hi - lo;
if (nRemaining < 2)
return; // Arrays of size 0 and 1 are always sorted
// If array is small, do a "mini-TimSort" with no merges
if (nRemaining < MIN_MERGE) {
int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
binarySort(a, lo, hi, lo + initRunLen, c);
return;
}
}從這個我們看出,它的底層調用的是binarySort()方法來實現的。
其他優秀部落格參考:(同樣是對Collections.sort()的講解)
1.http://trinea.iteye.com/blog/1248517
Java基礎集合類總結之Collections.sort()