2013-03-16 28 views
6

Code:Arrays.sort (object []) không được ném 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 
    } 

} 

Theo Java Đốc: Arrays#sort

Sắp xếp mảng theo quy định của các đối tượng vào thứ tự tăng dần, theo tự nhiên đặt hàng các yếu tố của nó. Tất cả các phần tử trong mảng phải triển khai giao diện Comparable.

Tại sao Arrays#sort, không ném ClassCastException như đã nêu bởi JavaDoc?

Trả lời

7

Bởi vì mã nguồn của Arrays.sort() có shortcut này:

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

Vì vậy, nó không làm phiền kiểm tra nếu các yếu tố của mảng thực hiện tương đương, bởi vì nó không phải sắp xếp một mảng mà chỉ có một phần tử.

Lưu ý rằng javadoc không bảo đảm rằng một ClassCastException được ném.

+0

Thú vị - điều tương tự đã được "cố định" trong TreeMap trong Java 7, nhưng dường như không nằm trong mảng ... – assylias

+0

Vì vậy, javadoc có thể lừa dối. – Apurv

2

Bởi vì nó chỉ có một yếu tố ... Và Array.sort() sẽ kết thúc mà không cần sắp xếp nếu có những yếu tố ít hơn 2

0

Lý do là danh sách mà chỉ có một elemnt, các phương thức compareTo không bao giờ viện dẫn trong Arrays.sort , vì vậy phần tử không bao giờ được truyền tới Comparable.

nhưng nó gọi anyway trong 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]); 
} 
} 

tất cả elemnt được đúc để T kéo dài từ tương đương

Các vấn đề liên quan