Java面试总结系列之Collections.sort()
面試中被問到,集合類中的排序方法是怎么實現的?沒有回答上來,故而總結如下:你知道么?
前提:在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
轉載于:https://www.cnblogs.com/jianmang/articles/4880989.html
總結
以上是生活随笔為你收集整理的Java面试总结系列之Collections.sort()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算几何 模板
- 下一篇: 在SQL Server里如何进行页级别的