2013-03-16 10 views
6

Code:Arrays.sort (Objekt []) wirft nicht Classcast

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 
    } 

} 

Per Java Doc: Arrays#sort

Sortierungen das angegebene Array von Objekten in aufsteigender Reihenfolge nach der Natur Ordnung seiner Elemente. Alle Elemente im Array müssen implementieren die vergleichbare Schnittstelle.

Warum Arrays#sort, wirft nicht ClassCastException wie von JavaDoc angegeben?

Antwort

7

Da der Quellcode von Arrays.sort() diese Abkürzung hat: Prüfen, es macht

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

also nicht stören, wenn die Elemente des Arrays Vergleichbare implementieren, weil es nicht um ein Array zu sortieren hat, die nur hat ein Element.

Beachten Sie, dass das Javadoc garantiert nicht garantiert, dass eine ClassCastException ausgelöst wird.

+0

Interessante erstreckt - wurde in TreeMap in Java 7, die gleiche Sache "fixiert", aber anscheinend nicht in Arrays ... – assylias

+0

So kann Javadoc täuschen. – Apurv

2

Weil es nur ein Element hat ... Und die Array.sort() wird unsortiert enden, wenn es Elemente weniger als 2

0

Der Grund dafür ist, dass die Liste nur eine elemnt hat, die Methode compareTo nie in Arrays.sort aufgerufen , so wird das Element niemals in Vergleichbar umgewandelt.

aber es ist auf jeden Fall in Collections.sort aufgerufen:

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]); 
} 
} 

alle elemnt auf T wirft, die von Vergleichbare