2013-03-16 67 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被铸造从延伸牛逼可比