なぜCollections.sort()は、LinkedListのために最適化されますが、ArrayListのために最適化されていませんか?

バインイースChitteti:

なぜCollections.sort()にようやくをコピーソートされた配列の背中をアレイ上の余分なオブジェクト配列と行いティムソートを作成し、Listオブジェクト?私はのために最適化され、この呼び出しを知っているLinkedListが、我々は、パフォーマンスのために出失うことはありませんかArrayList

我々は回避している可能性が2nオブジェクト配列に変換し、バックリストに追加することで操作の数を。私はこれらの余分な操作が全体のソート操作のビッグ-Oに影響を与えないことを知って、私はそれがさらに用に最適化されていたかもしれないと考えていますArrayList

私はここで何かが足りないのですか?私はちょうどアーキテクチャはようレイアウトされている理由を理解しようとしています。ありがとうございました。

https://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Collections.java#l164

彼らは次のとおりでした:

あなたは、古いJDKのバージョンを見ています。JDK 1.8.0_162以来以来、少なくともCollections.sort()通話Listさんsort(Comparator<? super E> c)そして、デフォルトの実装から配列を作成しながらList、その配列、ソートArrayListオーバーライドそのデフォルトの実装を、直接補助配列をソートします。

Collections「S sort

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

List「S sort

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

ArrayList「S 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++;
}

言い換えれば、これはあなたが見ているものより新しいJDKのバージョンで解決されています。

あなたは、ソースを見ることができ、ここで(eckesのリンクのおかげで)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=137944&siteId=1