2017-04-02 2 views
0

私はjava.util.Arraysのソースコードを見てきました。ソートするときは常に配列の長さを参照しています(ArrayListの場合は、E []データ(一時的な)フィールドの長さ。 java.util.ArraysはArrayList(長さとサイズ)のソートをどのように処理しますか?

+1

あなたは既にそのソースを掘り下げているので、その一部を投稿してみませんか?そこにはJDKの複数のバージョンがありますので、あなたが覗いたソースコードをすべて見ていることを知っていますか? – GhostCat

+3

'Arrays'は' ArrayList'をソートすることとは関係ありません。あなたは 'Collections'を考えていますか? –

答えて

0

答えがCollectionsで見つかった場合は、長さが等しいArrayListの配列を返すtoArray()が返されますサイズに、Arraysはコピーをソートし、Collectionsは、実際のArrayListをソートすることを使用しています。

1

それをソートするとき、常にlengtを指し、 hの配列

いいえ。すべてのデータ型に対して、とtoIndexパラメータを受け入れ、並べ替える配列の正確な部分を指定して、Arrays.sort(Object[] a, int fromIndex, int toIndex, Comparator<? super T> c)のようなArrays.sortのオーバーロードがあります。

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++; 
} 

ArrayList選別方法に直接独自size変数を渡し:ArrayList.sortによって呼び出されるメソッドである

its sort methodを上書きしませんListについては

、最初default implementationは一時配列と種類に内容をダンプします:デフォルトの実装は、このリスト内のすべての要素を含む配列を取得し、配列をソート

配列内の対応する位置から各要素をリセットするこのリストを反復処理します。 (これは代わりに、リンクされたリストをソートしようとしn2のログ(n)のパフォーマンスを回避することができます。)

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

のJava 8で始まり、古い方法Collections.sort(list)はちょうどlist.sort(null)起動します。

+0

既に答えが見つかりましたが、あなたの方がはっきりしています。 –

関連する問題