List インターフェイスのコレクション フレームワークのチュートリアルには、List 実装からの要素の削除のパフォーマンスに関する興味深い引用があります。
ArrayList などの多くの一般的な List 実装では、リストの末尾から要素を削除するパフォーマンスは、最初から要素を削除するパフォーマンスよりも大幅に優れています。
チュートリアルでは、これ以上の説明はありません。なぜそうなのかを正確に理解しようとしています。
ArrayList<Integer> list
以下のように考える:
最初のシナリオでは、 の末尾から最後の 4 つの要素を削除すると、list
これらの値はnull
(または同等の) に設定されます。私の理論では、コピー操作が必要な場合、そうでない要素のみnull
がコピーされるというものです。
2 番目のシナリオでは、最初の 4 つの要素を削除すると、それらはnull
何度も に設定され、非null
要素のみがコピーされます。
この観点から見ると、パフォーマンスはほぼ同じように見えます。最後から実行すると操作が速くなる別の理由はありますか?
一方、 についてLinkedList
は、逆が成り立つように見えます。最初から削除する方が高速ですが、最後から削除するには、 atail-pointer
が保持されていない限り、ほぼ完全なトラバーサルが必要です。