Java LinkedList
リンクリスト(Linked list)は一般的な基礎データ構造であり、線形リストの一種ですが、線形的な順序でデータを格納するわけではなく、各ノードに次のノードへのアドレスを格納します。
リンクリストは単方向リンクリストと双方向リンクリストに分けられます。
単方向リンクリストは2つの値を含みます: 現在のノードの値と、次のノードを指すリンクです。

双方向リンクリストには3つの整数値があります: 値、後方(次)ノードへのリンク、前方(前)ノードへのリンクです。

Java LinkedList(リンクリスト)は ArrayList に似ており、よく使われるデータコンテナです。
ArrayList と比較すると、LinkedList は追加と削除の操作効率が高く、検索と変更の操作効率は低くなります。
以下の場合は ArrayList を使用します:
- リスト内の特定の要素に頻繁にアクセスする場合。
- リストの末尾でのみ要素の追加・削除を行えばよい場合。
以下の場合は LinkedList を使用します:
- ループで反復処理してリスト内の一部の要素にアクセスする必要がある場合。
- リストの先頭、途中、末尾などの位置で頻繁に要素の追加・削除を行う必要がある場合。
LinkedList は AbstractSequentialList クラスを継承しています。
LinkedList は Queue インターフェースを実装しており、キューとして使用できます。
LinkedList は List インターフェースを実装しており、リスト関連の操作を行うことができます。
LinkedList は Deque インターフェースを実装しており、両端キューとして使用できます。
LinkedList は Cloneable インターフェースを実装しており、クローン作成が可能です。
LinkedList は java.io.Serializable インターフェースを実装しており、シリアライゼーションをサポートし、シリアライズによる転送が可能です。

LinkedList クラスは java.util パッケージにあります。使用する前にインポートする必要があります。構文は次のとおりです:
// 引入 LinkedList 类 import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通创建方法 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
簡単なリンクリストの例:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
System.out.println(sites);
}
}
上記の例を実行すると、出力結果は次のようになります:
[Google, サンプル, Taobao, Weibo]
多くの場合、リスト内のランダムな要素にアクセスするには ArrayList を使用する方が効率的ですが、以下のような場合には LinkedList がより効率的なメソッドを提供します。
リストの先頭に要素を追加する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
// addFirst() を使用して先頭に要素を追加
sites.addFirst("Wiki");
System.out.println(sites);
}
}
上記の例を実行すると、出力結果は次のようになります:
[Wiki, Google, サンプル, Taobao]
リストの末尾に要素を追加する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
// addLast() を使用して末尾に要素を追加
sites.addLast("Wiki");
System.out.println(sites);
}
}
上記の例を実行すると、出力結果は次のようになります:
[Google, サンプル, Taobao, Wiki]
リストの先頭から要素を削除する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
// removeFirst() を使用して先頭の要素を削除
sites.removeFirst();
System.out.println(sites);
}
}
上記の例を実行すると、出力結果は次のようになります:
[サンプル, Taobao, Weibo]
リストの末尾から要素を削除する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
// removeLast() を使用して末尾の要素を削除
sites.removeLast();
System.out.println(sites);
}
}
上記の例を実行すると、出力結果は次のようになります:
[Google, サンプル, Taobao]
リストの先頭の要素を取得する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
// getFirst() を使用して先頭の要素を取得
System.out.println(sites.getFirst());
}
}
上記の例を実行すると、出力結果は次のようになります:
リストの末尾の要素を取得する:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
// getLast() を使用して末尾の要素を取得
System.out.println(sites.getLast());
}
}
上記の例を実行すると、出力結果は次のようになります:
要素の反復
for と size() メソッドを組み合わせてリスト内の要素を反復処理できます:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
for (int size = sites.size(), i = 0; i < size; i++) {
System.out.println(sites.get(i));
}
}
}
size() メソッドはリンクリストのサイズを計算するために使用されます。
上記の例を実行すると、出力結果は次のようになります:
Google サンプル Taobao Weibo
for-each を使用して要素を反復処理することもできます:
例
import java.util.LinkedList;
public class サンプルTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<String>();
sites.add("Google");
sites.add("サンプル");
sites.add("Taobao");
sites.add("Weibo");
for (String i : sites) {
System.out.println(i);
}
}
}
上記の例を実行すると、出力結果は次のようになります:
Google サンプル Taobao Weibo
よく使われるメソッド
| メソッド | 説明 |
|---|---|
| public boolean add(E e) | リンクリストの末尾に要素を追加し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public void add(int index, E element) | 指定した位置に要素を挿入します。 |
| public boolean addAll(Collection extends E> c) | コレクションのすべての要素をリンクリストの末尾に追加し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public boolean addAll(int index, Collection extends E> c) | コレクションのすべての要素をリンクリストの指定した位置の後ろに追加し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public void addFirst(E e) | 要素を先頭に追加します。 |
| public void addLast(E e) | 要素を末尾に追加します。 |
| public boolean offer(E e) | リンクリストの末尾に要素を追加し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public boolean offerFirst(E e) | 先頭に要素を挿入し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public boolean offerLast(E e) | 末尾に要素を挿入し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public void clear() | リンクリストを空にします。 |
| public E removeFirst() | 最初の要素を削除して返します。 |
| public E removeLast() | 最後の要素を削除して返します。 |
| public boolean remove(Object o) | 指定した要素を削除し、成功したかどうかを返します。成功した場合は true、失敗した場合は false です。 |
| public E remove(int index) | 指定した位置の要素を削除します。 |
| public E poll() | 最初の要素を削除して返します。 |
| public E remove() | 最初の要素を削除して返します。 |
| public boolean contains(Object o)</td> | 指定した要素が含まれているかを判定します。 |
| public E get(int index) | 指定した位置の要素を返します。 |
| public E getFirst() | 最初の要素を返します。 |
| public E getLast() | 最後の要素を返します。 |
| public int indexOf(Object o) | 指定した要素が先頭から見て最初に出現するインデックスを検索します。 |
| public int lastIndexOf(Object o) | 指定した要素が最後に出現するインデックスを検索します。 |
| public E peek() | 最初の要素を返します。 |
| public E element() | 最初の要素を返します。 |
| public E peekFirst() | 先頭の要素を返します。 |
| public E peekLast() | 末尾の要素を返します。 |
| public E set(int index, E element) | 指定した位置の要素を設定します。 |
| public Object clone() | このリストをクローンします。 |
|
public Iterator | 逆順のイテレータを返します。 |
| public int size() | リンクリストの要素数を返します。 |
|
public ListIterator | 指定した位置から末尾までのイテレータを返します。 |
| public Object[] toArray() | リンクリストの要素からなる配列を返します。 |
|
public | リンクリストの要素を型変換してなる配列を返します。 |
さらに多くの API メソッドは次を参照してください:https://www.example.com/manual/jdk11api/java.base/java/util/LinkedList.html
その他の拡張
Java コレクションフレームワーク