java集合sort底层实现_Java面试总结系列之Collections.sort()
面試中被問到,集合類中的排序方法是怎么實現(xiàn)的?沒有回答上來,故而總結(jié)如下:你知道么?
前提:在eclipse中對于自己的代碼可以通過按住Ctrl的同時單擊名稱跳入相應(yīng)源碼中。但eclipse默認沒有添加java源代碼目錄,比如點擊Thread會提示source not found,而在開發(fā)中了解Java源代碼又是技術(shù)成長必要的。jdk默認是附帶源碼zip包的(jdk按裝目錄下的src.zip文件),我們可以通過添加源碼在eclipse中查看。在提示source not found界面,點擊Attach Source…->External File,在jdk目錄下選擇src.zip即可。(jdk目錄可以在系統(tǒng)變量%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
System.out.println(list.get(i));
}
}
}
輸出:
87
123
321
然后,我們來查看Collections.sort()方法,跳轉(zhuǎn)到的代碼如下:
public class collections{
@SuppressWarnings("unchecked")
public static > void sort(List list) {
list.sort(null);
}
}然后,我們點擊list.sort()方法,跳轉(zhuǎn)如下:
public interface List extends Collection{
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator super E> c) {??? //jdk 1.8中新特性,接口中可以寫方法實體,在方法前加default.
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
}然后,產(chǎn)生了疑問,在Collection.sort()方法中,list.sort(null)傳入的是NULL,但是在list.sort()函數(shù)中,參數(shù)是default void sort(Comparator super E> c),然后ctrl點擊Comparator,
然后,我們看到調(diào)用了Arrays.sort()方法,進入這個Arrays.sort()方法中,
public class Arrays{
public static 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 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;
}
}從這個我們看出,它的底層調(diào)用的是binarySort()方法來實現(xiàn)的。
其他優(yōu)秀博客參考:(同樣是對Collections.sort()的講解)
1.http://trinea.iteye.com/blog/1248517
總結(jié)
以上是生活随笔為你收集整理的java集合sort底层实现_Java面试总结系列之Collections.sort()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中整数的整数次方_数值的整数次方
- 下一篇: 情怀java手机网游_经典端游移植手游