JavaのLinkedList – JavaのLinkedList
JavaのLinkedListは、ListとDequeのインタフェースの実装です。これは頻繁に使用されるListの実装クラスの一つです。LinkedListはAbstractSequentialListを拡張し、ListとDequeのインタフェースを実装しています。これは順序付けられたコレクションであり、重複した要素をサポートします。要素は挿入された順序で保管されます。また、null要素の追加もサポートします。インデックスに基づく操作もサポートしています。Listの基本について詳しく学びたい場合は、この投稿をご覧ください:Java List。
投稿 簡単な目次表
この投稿では、以下の概念について議論します。
- Java LinkedList
- Java LinkedList Class Diagram
- Java LinkedList List Methods
- Java LinkedList Deque Methods
- Java LinkedList Basic Example
- Java LinkedList Generics
- Java Array to LinkedList
- Java LinkedList to Array
- Java LinkedList Real-time Usecases
- Internal Representation of Java LinkedList
- How Insertion works in Java LinkedList?
- How Deletion works in Java LinkedList?
- Java LinkedList Deque Operations
- Java SE 8: Java LinkedList to Stream
- Java SE 9 LinkedList
JavaのLinkedListを言い換える:
このセクションでは、JavaのLinkedListについての重要なポイントについて議論します。
- Java LinkedList class is a member of the Java Collections Framework.
- It is an implementation of the List and Deque interfaces.
- Internally, it is an implemented using Doubly Linked List Data Structure.
- It supports duplicate elements.
- It stores or maintains it’s elements in Insertion order.
- We can add any number of null elements.
- It is not synchronised that means it is not Thread safe.
- We can create a synchronised LinkedList using Collections.synchronizedList() method.
- In Java applications, we can use it as a List, stack or queue.
- It does not implement RandomAccess interface. So we can access elements in sequential order only. It does not support accessing elements randomly.
- When we try to access an element from a LinkedList, searching that element starts from the beginning or end of the LinkedList based on where that elements is available.
- We can use ListIterator to iterate LinkedList elements.
- From Java SE 8 on-wards, we can convert a LinkedList into a Stream and vice-versa.
- Java SE 9 is going to add couple of factory methods to create an Immutable LinkedList.
JavaのLinkedListクラスのダイアグラム
![](https://cdn.silicloud.com/blog-img/blog/img/65648c19daa94e2bdf7bc4eb/8-0.jpg)
JavaのLinkedListリストメソッドについての日本語の表現: 「Java LinkedListのリストメソッド」
このセクションでは、便利でよく使用されるJava LinkedListのメソッドについて説明します。次のメソッドは、ListまたはCollectionインターフェースから継承されています。
-
- size():リスト内の要素数を取得します。
-
- isEmpty():リストが空であるかどうかを確認します。
-
- contains(Object o):指定された要素がこのリストに含まれている場合、trueを返します。
-
- iterator():このリストの要素に対するイテレータを正しい順序で返します。
-
- toArray():このリストのすべての要素を正しい順序で含む配列を返します。
-
- add(E e):指定された要素をリストの末尾に追加します。
-
- remove(Object o):指定された要素の最初の出現をこのリストから削除します。
-
- retainAll(Collection c):このリストに含まれている要素のみを保持します。
-
- clear():リストからすべての要素を削除します。
-
- get(int index):リスト内の指定された位置の要素を返します。
-
- set(int index、E element):リスト内の指定された位置の要素を指定された要素で置き換えます。
-
- listIterator():リスト内の要素に対するリストイテレータを返します。
- subList(int fromIndex、int toIndex):指定されたfromIndex(含む)からtoIndex(排他的)までのリストの一部を返します。返されるリストはこのリストによってバックアップされるため、返されるリストでの非構造的な変更はこのリストに反映され、逆もまた同様です。
JavaのLinkedList Dequeメソッド。
LinkedListクラスで独自のメソッドを利用するためには、Dequeインターフェースから継承された特定のメソッドを使用します。
-
- void addFirst(E e): このリストの先頭に指定された要素を挿入します。
-
- void addLast(E e): このリストの末尾に指定された要素を挿入します。
-
- E getFirst(): このリストの最初の要素を取得しますが、削除はしません。このメソッドは、このリストが空の場合に例外をスローする点でpeekFirstと異なります。
-
- E getLast(): このリストの最後の要素を取得しますが、削除はしません。このメソッドは、このリストが空の場合に例外をスローする点でpeekLastと異なります。
-
- E remvoeFirst(): このリストから最初の要素を削除して返します。
-
- E removeLast(): このリストから最後の要素を削除して返します。
-
- boolean offerFirst(E e): 指定された要素をこのリストの前に挿入します。
-
- boolean offerLast(E e): 指定された要素をこのリストの末尾に挿入します。
-
- E pollFirst(): このリストの最初の要素を取得して削除します。ただし、このリストが空の場合はnullを返します。
-
- E pollLast(): このリストの最後の要素を取得して削除します。ただし、このリストが空の場合はnullを返します。
-
- E peekFirst(): このリストの最初の要素を取得しますが、削除はしません。ただし、このリストが空の場合はnullを返します。
- E peekLast(): このリストの最後の要素を取得しますが、削除はしません。ただし、このリストが空の場合はnullを返します。
JavaのLinkedListの基本的な例
このセクションでは、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()メソッドを使用します。注意:Genericsを使用せずに、Java LinkedListは異種の要素をサポートしています。ただし、Genericsを使用しないでコレクションを使用することはお勧めできません。次のセクションで、単純な例を使用してJava Genericsの利点と使用方法を探ってみましょう。
JavaのLinkedListのジェネリクス。
このセクションでは、JavaのLinkedListでGenericsを使用する方法について説明します。JavaのGenericsは、型安全なプログラミングを行うために役立ち、コンパイル時により強力な型チェックを行うことができます。また、キャストのオーバーヘッドを削減するのにも役立ちます。例えば:
import java.util.LinkedList;
import java.util.List;
public class LinkedListGenericsDemo
{
public static void main(String[] args)
{
List<String> names = new LinkedList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// We cannot add other than Strings
// 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にNumberを追加しようとすると、コンパイル時エラーが発生します。
Javaの配列をリンクリストに変換する
このセクションでは、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を配列に変換
このセクションでは、JavaのLinkedListを配列に変換する方法について探っていきます。多くの方法がありますが、ここでは1つのアプローチのみを紹介します。例:
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を使用する際の、最良の場合と最悪の場合のシナリオについて話し合います。最良の利用例:
- When our frequently used operation is adding or removing elements in the middle of the List, LinkedList is the best class to use.
なぜなら、リストの中間に要素を追加または削除するためにさらにシフトする必要がないからです。詳細は、「J Java LinkedListにおける挿入の仕組み」セクションを参照してください。最悪の使用ケースシナリオは次の通りです:
- When our frequently used operation is retrieving elements from list, then LinkedList is the worst choice.
なぜですか?なぜならLinkedListは順次アクセスのみをサポートし、ランダムアクセスをサポートしていないからです。詳しくは、「JavaのLinkedListで削除がどのように動作するか」セクションを参照してください。注意:LinkedListはList、Deque、Cloneable、およびSerializableを実装していますが、RandomAccessインターフェースを実装していません。
JavaのLinkedListの内部表現
![](https://cdn.silicloud.com/blog-img/blog/img/65648c19daa94e2bdf7bc4eb/44-0.png)
-
- 左側のノード部分は、LinkedList内の前のノード(または要素)を指すために使用されます。
-
- 右側のノード部分は、LinkedList内の次のノード(または要素)を指すために使用されます。
- 中央のノード部分は、実際のデータを保存するために使用されます。
![](https://cdn.silicloud.com/blog-img/blog/img/65648c19daa94e2bdf7bc4eb/46-0.png)
Java LinkedListにおける挿入の仕組みはどのように機能しますか?
前のセクションで、LinkedListが要素をノードとして保存する方法をすでに見てきました。このセクションでは、JavaのLinkedListの挿入操作が内部でどのように機能するかについて説明します。
-
- 我々の最初のLinkedListには、以下のデータがあると仮定しましょう。
- 3. このLinkedListに対して、次の挿入操作を行います。
linkedList.add(2,54);
![](https://cdn.silicloud.com/blog-img/blog/img/65648c19daa94e2bdf7bc4eb/51-0.png)
JavaのLinkedListでの削除の仕組みはどのように機能しますか?
私たちは既に前のセクションでLinkedListの挿入操作の内部動作を見てきました。このセクションでは、Java LinkedListの削除操作が内部でどのように機能するかについて説明します。
-
- 私たちの初期のLinkedListには、次のデータがあると仮定しましょう。
- 3. このLinkedListに対して次の挿入操作を実行してください。
linkedList.remove(3);
![](https://cdn.silicloud.com/blog-img/blog/img/65648c19daa94e2bdf7bc4eb/56-0.png)
JavaのLinkedListのDeque操作
ここでは、LinkedListオブジェクトがDequeとしてどのように動作するかを探求します。これらの操作を使用して、QueueやStackを実装します。私の後の投稿では、StackやQueueがどのように動作するかを詳しく説明します。例:
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<Integer> numbersList = new LinkedList<>();
numbersList.add(1);
numbersList.add(2);
numbersList.add(3);
numbersList.add(4);
numbersList.add(5);
//convert List to stream
numbersList.stream().forEach(System.out::println);
}
}
出力:
1
2
3
4
5
Java SE 9のLinkedList。
Java SE 9において、Oracle CorpはImmutable Listを作成するための便利なユーティリティメソッドを追加する予定です。これらについて詳しく学びたい場合は、私の記事「Java SE 9: Factory Methods for Immutable List」をご覧ください。これがJavaにおけるLinkedListに関する簡単なまとめになります。これらのJava LinkedListの例がLinkedListプログラミングのスタートに役立つことを願っています。私のチュートリアルを読んでいただき、ありがとうございます。もしよろしければ、私のチュートリアルが役に立ったり、問題や提案、タイプエラーなどがあれば、コメントを残してください。