Java の LinkedList – Java での LinkedList

Java LinkedListはListおよびDequeインターフェースの実装です。これは頻繁に使用されるList実装クラスの一つです。AbstractSequentialListを拡張し、ListおよびDequeインターフェースを実装しています。これは順序つきのコレクションで、重複する要素をサポートします。要素は挿入順に格納されます。null要素の追加をサポートします。インデックスベースの操作をサポートします。Listの基本について詳しく知りたい場合は、この記事を参照してください:Java List

記事の簡単な目次

この記事では以下の概念について議論します。

  • Java LinkedList
  • Java LinkedListクラス図
  • Java LinkedListリストメソッド
  • Java LinkedListデキューメソッド
  • Java LinkedList基本の例
  • Java LinkedListジェネリクス
  • Java ArrayからLinkedListへの変換
  • Java LinkedListからArrayへの変換
  • Java LinkedListリアルタイムユースケース
  • Java LinkedListの内部表現
  • Java LinkedListへの挿入の動作
  • Java LinkedListからの削除の動作
  • Java LinkedListデキューの操作
  • Java SE 8: Java LinkedListからStreamへ
  • Java SE 9 LinkedList

Java LinkedList

このセクションでは、Java LinkedListに関するいくつかの重要なポイントについて説明します。

  • Java LinkedListクラスは、Javaコレクションフレームワークのメンバーです。
  • これはListおよびDequeインターフェースの実装です。
  • 内部的には、ダブルリンクリストデータ構造を使用して実装されています。
  • 重複した要素をサポートしています。
  • 挿入順序で要素を格納または維持します。
  • 任意の数のnull要素を追加できます。
  • 同期されていないため、スレッドセーフではありません。
  • Collections.synchronizedList()メソッドを使用して同期されたLinkedListを作成できます。
  • Javaアプリケーションでは、List、スタック、またはキューとして使用できます。
  • RandomAccessインターフェースは実装されていません。そのため、要素には順次アクセスできます。要素にランダムにアクセスすることはできません。
  • LinkedListから要素にアクセスしようとすると、その要素が利用可能な場所に基づいて、リンクリストの先頭または末尾から検索が開始されます。
  • ListIteratorを使用してLinkedListの要素を反復処理できます。
  • Java SE 8以降、LinkedListをStreamに変換したり、その逆も行ったりできます。
  • Java SE 9では、Immutable LinkedListを作成するためのいくつかのファクトリメソッドが追加される予定です。

Java LinkedList クラス ダイアグラム

Java LinkedList は List 実装クラスの一つです。また、Deque も実装しています。以下のクラス ダイアグラムに示すように、これは AbstractList クラスから直接拡張されていません。代わりに AbstractSequentialList クラスを拡張しています。

Java LinkedList リスト メソッド

このセクションでは、いくつかの有用で頻繁に使用される Java LinkedList メソッドについて説明します。次のメソッドは List または Collection インターフェースから継承されています:

  1. int size(): リスト内の要素数を取得します。
  2. boolean isEmpty(): リストが空であるかどうかを確認します。
  3. boolean contains(Object o): このリストが指定された要素を含んでいる場合、true を返します。
  4. Iterator iterator(): このリスト内の要素に対するイテレータを返します。
  5. Object[] toArray(): このリスト内のすべての要素を正しい順序で含む配列を返します。
  6. boolean add(E e): 指定された要素をこのリストの末尾に追加します。
  7. boolean remove(Object o): このリストから指定された要素の最初の出現を削除します。
  8. boolean retainAll(Collection c): 指定されたコレクションに含まれる要素のみをこのリストに保持します。
  9. void clear(): リストからすべての要素を削除します。
  10. E get(int index): Returns the element at the specified position in the list.
  11. E set(int index, E element): Replaces the element at the specified position in the list with the specified element.
  12. ListIterator listIterator(): リスト内の要素に対するリストイテレーターを返します。
  13. List subList(int fromIndex, int toIndex): このリストの指定された fromIndex(含む)から toIndex(排他的)までの部分のビューを返します。返されたリストはこのリストによって支えられているため、返されたリスト内の非構造的な変更はこのリストに反映され、その逆もまた然りです。

Java LinkedList Deque Methods

以下のメソッドは、Deque インターフェースから継承された LinkedList クラス固有のものです:

  1. void addFirst(E e): 指定された要素をこのリストの先頭に挿入します。
  2. void addLast(E e): 指定された要素をこのリストの末尾に挿入します。
  3. E getFirst(): Retrieves, but does not remove, the first element of this list. This method differs from peekFirst only in that it throws an exception if this list is empty.
  4. E getLast(): Retrieves, but does not remove, the last element of this list. This method differs from peekLast only in that it throws an exception if this list is empty.
  5. E remvoeFirst(): Removes and returns the first element from this list.
  6. E removeLast(): Removes and returns the last element from this list.
  7. boolean offerFirst(E e): 指定された要素をこのリストの先頭に挿入します。
  8. boolean offerLast(E e): 指定された要素をこのリストの末尾に挿入します。
  9. E pollFirst(): Retrieves and removes the first element of this list, or returns null if this list is empty.
  10. E pollLast(): Retrieves and removes the last element of this list, or returns null if this list is empty.
  11. E peekFirst(): Retrieves, but does not remove, the first element of this list, or returns null if this list is empty.
  12. E peekLast(): Retrieves, but does not remove, the last element of this list, or returns null if this list is empty.

Java LinkedList Basic Example

このセクションでは、JavaのLinkedListの基本的な例について説明します。次のセクションでは、さらに便利な操作を探索します。 例:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListDemo 
{
  public static void main(String[] args) 
  {
	List names = new LinkedList();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

出力:-

LinkedList content: [Rams, Posa, Chinni, 2011]
LinkedList size: 4

ここでは、LinkedListオブジェクトを作成し、4つのアイテムを追加しました。 LinkedList.size()メソッドは、リスト内の要素数を取得するために使用されることを説明しました。 注意:- ジェネリクスを使用せずに、Java LinkedListは異種要素をサポートします。 ただし、ジェネリクスなしでコレクションを使用することは推奨されません。 1つの簡単な例でJavaジェネリクスの利点と使用法を次のセクションで探求しましょう。

Java LinkedListジェネリクス

このセクションでは、Java LinkedListでジェネリクスを使用する方法について説明します。 Javaジェネリクスは、タイプセーフプログラミングを記述するために役立ち、コンパイル時により強力な型チェックを行うのに役立ちます。 キャストのオーバーヘッドを排除するのにも役立ちます。 例:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListGenericsDemo
{
  public static void main(String[] args) 
  {
	List names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        // 文字列以外を追加できません
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

出力:-

LinkedList content: [Rams, Posa, Chinni]
LinkedList size: 3

ここでは、ジェネリクスを使用してLinkedListオブジェクトを作成し、3つのアイテムを追加しました。 LinkedListに数値を追加しようとすると、コンパイル時エラーが発生します。

Java配列からLinkedListへ

このセクションでは、Javaの配列をLinkedListオブジェクトに変換する方法について探求します。多くの方法で行うことができますが、ここでは一つのアプローチのみを紹介します。例:


import java.util.LinkedList;
import java.util.List;

public class JavaArrayToLinkedListDemo 
{
	public static void main(String[] args) 
	{
		Integer[] numbers = {1,2,3,4,5};
		List<Integer> numbersList = new LinkedList<>();
		for(Integer s : numbers){
			numbersList.add(s);
		}
		System.out.println(numbersList);
	}
}

出力:

[1, 2, 3, 4, 5]

Java LinkedListからArrayへの変換

このセクションでは、Java LinkedListをArrayに変換する方法について探求します。多くの方法で行うことができますが、ここでは一つのアプローチのみを紹介します。例:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class LinkedListToJavaArrayDemo 
{
	public static void main(String[] args) 
	{		
		List<Integer> numbersList = new LinkedList<>();
		numbersList.add(1);
		numbersList.add(2);
		numbersList.add(3);
		numbersList.add(4);
		numbersList.add(5);
		Integer[] numbers = new Integer[numbersList.size()];
		
		numbers = numbersList.toArray(numbers);
		System.out.println(Arrays.toString(numbers));

	}
}

出力:

[1, 2, 3, 4, 5]

Java LinkedListのリアルタイムユースケース

このセクションでは、JavaアプリケーションでLinkedListを使用する場合のベストケースとワーストケースシナリオについて議論します。ベストケースシナリオ:

  • リストの中間に要素を追加または削除する操作が頻繁に行われる場合、LinkedListは最適なクラスです。

なぜなら、リストの中間に要素を追加または削除する際に、より多くのシフトを行う必要がないからです。詳細は「Java LinkedListにおける挿入の動作」セクションを参照してください。ワーストケースシナリオ:

  • よく使用される操作がリストから要素を取得する場合、LinkedListは最悪の選択肢です。

なぜですか?なぜならLinkedListは順次アクセスしかサポートせず、ランダムアクセスをサポートしていないからです。詳細については、「Java LinkedListにおける削除の動作はどのようになっていますか?」セクションを参照してください。注:LinkedListはList、Deque、Cloneable、およびSerializableを実装していますが、RandomAccessインターフェースを実装していません。

Java LinkedListの内部表現

Java LinkedListは内部的には双方向リンクリストを使用して実装されていることがわかっています。そのため、Java LinkedListは要素をノードとして表します。各ノードは以下に示すように3つの部分に分かれています。ここでは、各ノードが特定の目的で使用されています。

  1. 左側のノード部分は、LinkedList内の前のノード(または要素)を指すために使用されます。
  2. 右側のノード部分は、LinkedList内の次のノード(または要素)を指すために使用されます。
  3. 中央のノード部分は実際のデータを格納するために使用されます。

注意: JVMでは、LinkedListは連続した順序で要素を格納しません。要素は利用可能なスペースのどこにでも格納され、左側と右側のノード部分を使用して相互に接続されます。下の図で示されています。

JavaのLinkedListでの挿入はどのように動作しますか?

前のセクションでLinkedListが要素をノードとして格納する方法を既に見てきました。このセクションでは、JavaのLinkedListの挿入操作が内部でどのように機能するかについて説明します。

  1. 初期のLinkedListに以下のデータがあると仮定してください。
    3. このLinkedListに以下の挿入操作を実行します。
linkedList.add(2,54);

ここでは、インデックス2.5に値が「54」の新しい要素を追加する挿入操作を行おうとしています。更新されたLinkedListは以下のようになります。

JavaのLinkedListでの削除はどのように動作しますか?

前のセクションで、LinkedListが挿入操作をどのように内部で実行するかをすでに見てきました。このセクションでは、Java LinkedListの削除操作が内部でどのように動作するかについて説明します。

  1. 初期のLinkedListに以下のデータがあると仮定しましょう。
    3. このLinkedListに対して以下の挿入操作を実行します。
linkedList.remove(3);

ここで、インデックス3にある要素を削除する削除操作を実行しようとしています。5. 更新されたLinkedListは以下のようになります。

Java LinkedList Deque操作

ここでは、LinkedListオブジェクトがDequeとして機能する方法について説明します。これらの操作を使用して、キューやスタックを実装します。スタックやキューの動作については、今後の投稿で詳しく説明します。例:

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Deque;

public class LinkedListDequeOperationsDemo 
{
  public static void main(String[] args) 
  {
	Deque names = new LinkedList();
	names.add(2);
	names.addFirst(1);
	names.addLast(3);
	names.addFirst(0);
	names.addLast(4);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
	names.removeFirst();
	names.removeLast();
	
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());	
  }
}

出力:

LinkedList content: [0, 1, 2, 3, 4]
LinkedList size: 5
LinkedList content: [1, 2, 3]
LinkedList size: 3

Java SE 8:Java LinkedListからStreamへの変換

ここでは、LinkedListオブジェクトをJava SE 8のStreamコンセプトに変換する方法について説明します。例:

import java.util.LinkedList;
import java.util.List;

public class LinkedListToStreamDemo 
{
  public static void main(String[] args) 
  {		
	List numbersList = new LinkedList<>();
	numbersList.add(1);
	numbersList.add(2);
	numbersList.add(3);
	numbersList.add(4);
	numbersList.add(5);
		
	//リストをストリームに変換する
	numbersList.stream().forEach(System.out::println);
  }
}

出力:

1
2
3
4
5

Java SE 9 LinkedList

Java SE 9では、Oracle Corpは不変リストを作成するための便利なユーティリティメソッドをいくつか追加する予定です。これらをより詳しく、いくつかの有用な例を交えて学びたい場合は、次の投稿をご覧ください:Java SE 9: Factory Methods for Immutable List 以上がJavaでのLinkedListに関する簡単なまとめです。これらのJava LinkedListの例が、LinkedListプログラミングの始め方に役立つことを願っています。私のチュートリアルをお読みいただきありがとうございます。私のチュートリアルが気に入った場合や問題や提案、またはタイプエラーがある場合は、コメントをお寄せください。

Source:
https://www.digitalocean.com/community/tutorials/java-linkedlist-linkedlist-java