ここで答えた一人一人が正しいです。それらはすべて、使用パターンに大きく依存するという概念に基づいています。つまり、万能のリストはありません。しかし、私の執筆の時点で、彼らはすべて、LinkedListが最高の場合のユースケース(イテレーターに配置された挿入)について言及するのを忘れていました(それ、または私はずさんな読者です)。つまり、あなたがしているだけではない場合
LinkedList::add(int index, E element)
Inserts the specified element at the specified position in this list.
これは彼らが統計を取得するために使用した方法のようですが、
iterator.insert(E element)
iterator
いずれかを介して取得
public abstract ListIterator<E> listIterator(int index)
Returns a list-iterator of the elements in this list (in proper sequence), starting at the specified position in the list.
また
public Iterator<E> iterator()
Returns an iterator over the elements in this list (in proper sequence).
、その後、これまでで最高の任意の挿入パフォーマンスを得ることができます。これはもちろん、iterator()とlistIterator()の呼び出し回数、およびリスト内でのイテレーターの移動回数を制限できることを意味します(たとえば、リストを1回だけシーケンシャルパスして、必要なすべての挿入を実行できます)。 )。これにより、ユースケースの数は非常に限られていますが、それでも非常に頻繁に発生するユースケースです。そして、LinkedListのパフォーマンスが、Javaだけでなく、すべての言語のすべてのコンテナーコレクションに保持されている(そして将来的にはそうなる)理由です。
PS。もちろん、上記のすべては、get()、remove()などの他のすべての操作に適用されます。つまり、イテレータを介した慎重に設計されたアクセスにより、実際の定数が非常に小さいすべての操作がO(1)になります。もちろん、他のすべてのリストについても同じことが言えます。つまり、イテレータアクセスを使用すると、すべてのリストが高速化されます(ただし、わずかになります)。しかし、ArrayListのinsert()とremove()ではありません-それらはまだO(n)になります...そしてTreeListのinsert()とremove()ではありません-ツリーバランシングのオーバーヘッドは避けられないものです...そしてTreeListおそらくより多くのメモリオーバーヘッドがあります...あなたは私の考えを理解します。要約すると、LinkedListは、リストに対する小さな高性能スキャンのような操作用です。それが必要なユースケースであるかどうかは、あなただけが判断できます。
PSS。そうは言っても、私も残っています
彼らはArrayListの増大する苦痛を償却または無視し、すでに配置されているLinkedList内のアイテムの挿入時間と削除時間を考慮していないと結論付けようとしました。