Arrays.sort(object [])不会抛出classcastexception

时间:2013-03-16 14:22:38

标签: java arrays sorting classcastexception comparable

代码:

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 Doc: Arrays#sort

按照升序对指定的对象数组按升序排序   其元素的自然排序。 数组中的所有元素都必须 实现Comparable接口

为什么Arrays#sort不会像JavaDoc所说的那样抛出ClassCastException

3 个答案:

答案 0 :(得分:7)

因为Arrays.sort()的源代码具有以下快捷方式:

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

因此,它不会检查数组的元素是否实现Comparable,因为它不必对只有一个元素的数组进行排序。

请注意,javadoc不会保证抛出ClassCastException。

答案 1 :(得分:2)

因为它只有一个元素......如果元素少于2,Array.sort()将结束而不进行排序

答案 2 :(得分:0)

原因是list只有一个elemnt,从不在Arrays.sort中调用compareTo方法,因此该元素永远不会被强制转换为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都从T形扩展到可比较

相关问题