バインイースChitteti:
なぜCollections.sort()
にようやくをコピーソートされた配列の背中をアレイ上の余分なオブジェクト配列と行いティムソートを作成し、List
オブジェクト?私はのために最適化され、この呼び出しを知っているLinkedList
が、我々は、パフォーマンスのために出失うことはありませんかArrayList
?
我々は回避している可能性が2n
オブジェクト配列に変換し、バックリストに追加することで操作の数を。私はこれらの余分な操作が全体のソート操作のビッグ-Oに影響を与えないことを知って、私はそれがさらに用に最適化されていたかもしれないと考えていますArrayList
。
私はここで何かが足りないのですか?私はちょうどアーキテクチャはようレイアウトされている理由を理解しようとしています。ありがとうございました。
彼らは次のとおりでした:
あなたは、古い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のリンクのおかげで)。