2013-03-16 56 views
6

代碼:Arrays.sort(對象[])沒有被拋ClassCastException異常

public class CompareTest { 

    public static void main(String[] args) { 

     ArrayList list = new ArrayList(); 
     (list).add(new CompareTest()); 


     Arrays.sort(list.toArray()); //Does not throw Exception , why ? 
     Collections.sort(list); //throws ClassCastException 
    } 

} 

作爲每Java文檔: Arrays#sort

對指定對象升序排列的陣列,根據 自然對其元素進行排序。 陣列中的所有元素必須使用 實現Comparable接口

爲什麼Arrays#sort,does not throw ClassCastException正如JavaDoc所述?

回答

7

由於Arrays.sort()的源代碼有此捷徑

int nRemaining = hi - lo; 
    if (nRemaining < 2) 
     return; // Arrays of size 0 and 1 are always sorted 

所以它不打擾如果數組的元素實現可比,因爲它不具有那種只有一個數組檢查一個元素。

請注意,javadoc不保證保證拋出ClassCastException。

+0

有趣的 - 同樣的事情在Java 7中的TreeMap的「固定」,但顯然不在陣列... – assylias 2013-03-16 14:31:07

+0

所以javadoc可以欺騙。 – Apurv 2013-03-16 14:35:26

2

,因爲它只有一個元素...如果有元素小於2

0

究其原因,Array.sort()將不排序到底是什麼人名單隻有一個elemnt,compareTo方法從未在Arrays.sort調用,所以元素永遠不會轉換爲Comparable。

,但它無論如何援引Collections.sort:

public static <T extends Comparable<? super T>> void sort(List<T> list) { 
Object[] a = list.toArray(); 
Arrays.sort(a); 
ListIterator<T> i = list.listIterator(); 
for (int j=0; j<a.length; j++) { 
    i.next(); 
    i.set((T)a[j]); 
} 
} 

所有elemnt被鑄造從延伸牛逼可比