代码:
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
?
答案 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形扩展到可比较