JavaのLinkedListガイド

Java LinkedListのガイド

1. 前書き

LinkedListは、ListおよびDequeインターフェースの二重リンクリスト実装です。 すべてのオプションのリスト操作を実装し、すべての要素(nullを含む)を許可します。

2. 特徴

以下に、LinkedListの最も重要なプロパティを示します。

  • リストにインデックスを付ける操作は、指定されたインデックスに近い方の最初または最後からリストを走査します。

  • synchronizedではありません

  • そのIteratorおよびListIteratorイテレータはfail-fastです(つまり、イテレータの作成後、リストが変更されると、ConcurrentModificationExceptionがスローされます)

  • すべての要素はノードであり、次および前の要素への参照を保持します

  • 広告掲載順序を維持します

LinkedListは同期されていませんが、次のようにCollections.synchronizedListメソッドを呼び出すことで、同期されたバージョンを取得できます。

List list = Collections.synchronizedList(new LinkedList(...));

3. ArrayListとの比較

どちらもListインターフェースを実装していますが、セマンティクスが異なります。これは、どちらを使用するかの決定に確実に影響します。

3.1. 構造

ArrayListは、Arrayに裏打ちされたインデックスベースのデータ構造です。 O(1)と同等のパフォーマンスで、要素へのランダムアクセスを提供します。

一方、LinkedListはそのデータを要素のリストとして格納し、すべての要素はその前の要素と次の要素にリンクされます。 この場合、アイテムの検索操作の実行時間はO(n)に等しくなります。

3.2. オペレーション

アイテムの挿入、追加、および削除操作は、要素がコレクション内の任意の位置に追加されたときに配列のサイズを変更したりインデックスを更新したりする必要がなく、周囲の要素の参照のみであるため、LinkedListでより高速になります変更されます。

3.3. メモリ使用量

LinkedListのすべてのノードは、前の要素用と次の要素用の2つの参照を格納するため、LinkedListArrayListよりも多くのメモリを消費しますが、ArrayListはデータとそのインデックスのみ。

4. 使用法

LinkedListの使用方法を示すコードサンプルを次に示します。

4.1. 作成

LinkedList linkedList = new LinkedList<>();



4.2. 要素の追加

LinkedListListおよびDequeインターフェースを実装し、標準のadd()およびaddAll()メソッドに加えて、addFirst()およびaddLast()を見つけることができます。それぞれ最初または最後の要素。

4.3. 要素の削除

要素の追加と同様に、このリストの実装はremoveFirst()removeLast().を提供します

また、ブール値を返す便利なメソッドremoveFirstOccurence()およびremoveLastOccurence()があります(コレクションに指定された要素が含まれている場合はtrue)。

4.4. キュー操作

Dequeインターフェイスはキューのような動作を提供します(実際にはDequeQueueインターフェイスを拡張します):

linkedList.poll();
linkedList.pop();

これらのメソッドは、最初の要素を取得してリストから削除します。

poll()pop()の違いは、popは空のリストにNoSuchElementException()をスローするのに対し、pollはnullを返すことです。 APIpollFirst()およびpollLast()も使用できます。

たとえば、pushAPIがどのように機能するかを次に示します。

linkedList.push(Object o);

コレクションのヘッドとして要素を挿入します。

LinkedListには他にも多くのメソッドがあり、そのほとんどはすでにListsを使用しているユーザーにはなじみのあるものです。 Dequeによって提供される他のものは、「標準」メソッドの便利な代替手段である可能性があります。

完全なドキュメントはhereにあります。

5. 結論

ArrayListは通常、デフォルトのList実装です。

ただし、一定のアクセス時間と有効なメモリ使用量よりも、一定の挿入/削除時間(頻繁な挿入/削除/更新など)の設定など、LinkedListを使用する方が適している特定のユースケースがあります。

コードサンプルはover on GitHubにあります。