2017-04-02 1 views
0

Ich habe durch den Quelltext für java.util.Arrays gesucht und beim Sortieren bezieht sich immer auf die Länge des Arrays (die für eine ArrayList nehme ich annimmt bezieht sich auf die Länge der E [] Daten (transient) -Feld . Aber sollte es nicht tatsächlich beziehen sich auf die Größe Feld, da sie einander nicht immer gleich sind.Wie behandelt java.util.Arrays das Sortieren einer ArrayList (Länge vs Größe)?

+1

Da Sie bereits in diese Quelle gegraben haben, warum nicht ein paar davon veröffentlichen? Es gibt mehr als eine Version des JDK da draußen, also wer weiß, dass wir alle den Quellcode betrachten würden, den Sie gesehen haben ?! – GhostCat

+3

'Arrays' haben nichts damit zu tun,' ArrayList' zu sortieren, denkst du an 'Collections'? –

Antwort

0

fand die Antwort in Collections, ruft toArray(), die eine Anordnung der Arraylist zurückgibt, dessen Länge gleich auf die Größe, sortiert Arrays die Kopie und Collections verwendet, dass die tatsächliche Arraylist zu sortieren.

1

wenn es immer bezieht sich auf die lengt Sortierung h des Arrays

Nein, tut es nicht. Für jeden Datentyp gibt es eine Überladung von Arrays.sort, die fromIndex und toIndex Parameter akzeptiert, die den genauen Teil des zu sortierenden Arrays angeben, wie Arrays.sort(Object[] a, int fromIndex, int toIndex, Comparator<? super T> c).

, dass das Verfahren von ArrayList.sort aufgerufen:

public void sort(Comparator<? super E> c) { 
    final int expectedModCount = modCount; 
    Arrays.sort((E[]) elementData, 0, size, c); 
    if (modCount != expectedModCount) { 
     throw new ConcurrentModificationException(); 
    } 
    modCount++; 
} 

Die ArrayList gibt seine eigenen size variable direkt mit dem Sortierverfahren.

Für eine List die nicht its sort method enthebt, die default implementation zunächst den Inhalt in ein temporäres Array-Dumps und Sortiervorgänge, die:

Die Standardimplementierung eine Anordnung enthält, um alle Elemente in dieser Liste erhält, sortiert das Array, und iteriert über diese Liste und setzt jedes Element von der entsprechenden Position im Array zurück. (Dies vermeidet die n2 log (n) Leistung, die von dem Versuch zu sortieren eine verkettete Liste an Ort und Stelle zur Folge hätte.)

default void sort(Comparator<? super E> c) { 
    Object[] a = this.toArray(); 
    Arrays.sort(a, (Comparator) c); 
    ListIterator<E> i = this.listIterator(); 
    for (Object e : a) { 
     i.next(); 
     i.set((E) e); 
    } 
} 

Ab Java 8, die alte Methode Collections.sort(list) ruft nur list.sort(null).

+0

Bereits die Antwort gefunden, aber Ihre ist klarer. –

Verwandte Themen