このArrayList
クラスは、配列のラッパークラスです。内部配列が含まれています。
public ArrayList<T> {
private Object[] array;
private int size;
}
ALinkedList
は、データを管理するための内部ノードを持つ、リンクリストのラッパークラスです。
public LinkedList<T> {
class Node<T> {
T data;
Node next;
Node prev;
}
private Node<T> first;
private Node<T> last;
private int size;
}
現在のコードは、実際の実装ではなく、クラスがどのようになるかを示すために使用されていることに注意してください。実装がどのようになるかを知っているので、さらに分析を行うことができます。
ArrayListは、その要素にランダムにアクセスする場合、LinkedListよりも高速です。ランダムアクセスとは「n番目の要素を教えて」という意味だと思います。ArrayListの方が速いのはなぜですか?
ArrayListのアクセス時間:O(1)。LinkedListのアクセス時間:O(n)。
配列では、を使用して任意の要素にアクセスできますが、リンクリストでは、必要な要素を取得するまでarray[index]
、すべてのリストをナビゲートする必要があります。first
LinkedListは、削除に関してArrayListよりも高速です。私はこれを理解しています。内部バックアップ配列を再割り当てする必要があるため、ArrayListの速度は遅くなります。
ArrayListの削除時間:アクセス時間+ O(n)。LinkedListの削除時間:アクセス時間+ O(1)。
ArrayListは、インデックスを削除するために、すべての要素をアイテムの先頭array[index]
から先頭に移動する必要があります。array[index-1]
LinkedListは、そのアイテムまでナビゲートしてから、リストからノードを切り離してそのノードを消去する必要があります。
LinkedListは、削除に関してArrayListよりも高速です。私はこれを理解しています。内部バックアップ配列を再割り当てする必要があるため、ArrayListの速度は遅くなります。
ArrayListの挿入時間:O(n)。LinkedListの挿入時間:O(1)。
ArrayListがO(n)を取ることができるのはなぜですか?新しい要素を挿入して配列がいっぱいになると、より多くのサイズの新しい配列を作成する必要があるためです(2*サイズまたは3*サイズ/2のような式で新しいサイズを計算できます)。LinkedListは、最後のノードの隣に新しいノードを追加するだけです。
この分析は、Javaだけでなく、C、C ++、C#などの別のプログラミング言語でも行われます。
詳細はこちら: