Java LinkedList listIterator() メソッド
listIterator()メソッドは Java におけるLinkedListクラスが提供する重要なメソッドで、返すのはListIteratorオブジェクトで、リンクリスト内の要素を走査するために使用します。通常のIteratorと比較すると、ListIteratorより豊富な操作機能を提供します。
メソッド構文
public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
public ListIterator<E> listIterator(int index)
- 引数なしバージョン:リンクリストの先頭から始まるリストイテレータを返します
- 引数ありバージョン:指定したインデックス位置から始まるリストイテレータを返します
メソッドパラメータ
index パラメータ
- 型:
int - 意味:イテレータの開始位置のインデックス
- 値の範囲:
0 <= index <= size() - 渡されたインデックスがリンクリストのサイズ(
size()) と等しい場合、イテレータはリンクリストの末尾を指します
戻り値
返すのはListIteratorオブジェクトで、リンクリストを双方向に走査する機能を提供します。
ListIterator の主要メソッド
走査メソッド
boolean hasNext():次の要素が存在するかどうかを確認しますE next():次の要素を返し、カーソルを後方へ移動しますboolean hasPrevious():前の要素が存在するかどうかを確認しますE previous():前の要素を返し、カーソルを前方へ移動します
変更メソッド
void add(E e):現在位置に要素を挿入しますvoid remove():最後の呼び出しでnext()或previous()返された要素を削除しますvoid set(E e):最後の呼び出しでnext()或previous()返された要素を置換します
使用例
基本走査例
例
import java.util.LinkedList;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
// ListIterator を取得
ListIterator<String> iterator = fruits.listIterator();
// 順方向に走査
System.out.println("順方向の走査:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// 逆方向に走査
System.out.println("\n逆方向の走査:");
while(iterator.hasPrevious()) {
System.out.println(iterator.previous());
}
}
}
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
// ListIterator を取得
ListIterator<String> iterator = fruits.listIterator();
// 順方向に走査
System.out.println("順方向の走査:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// 逆方向に走査
System.out.println("\n逆方向の走査:");
while(iterator.hasPrevious()) {
System.out.println(iterator.previous());
}
}
}
指定位置から走査する
例
ListIterator<String> iterator = fruits.listIterator(1); // インデックス1から開始
System.out.println("インデックス1から走査:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("インデックス1から走査:");
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
リンクリストの内容を変更する
例
ListIterator<String> iterator = fruits.listIterator();
iterator.next(); // 最初の要素に移動
iterator.set("Apricot"); // 最初の要素を変更
iterator.add("Blueberry"); // 現在位置に新しい要素を追加
System.out.println("変更後のリンクリスト:");
for(String fruit : fruits) {
System.out.println(fruit);
}
iterator.next(); // 最初の要素に移動
iterator.set("Apricot"); // 最初の要素を変更
iterator.add("Blueberry"); // 現在位置に新しい要素を追加
System.out.println("変更後のリンクリスト:");
for(String fruit : fruits) {
System.out.println(fruit);
}
注意事項
並行変更:反復処理中にイテレータ自身のメソッド以外の方法でリンクリストを変更した場合は、
ConcurrentModificationException例外がスローされます。初期位置:新しく作成された
ListIteratorのカーソルの初期位置は、最初の要素の前(引数なしバージョンの場合)または指定したインデックス位置の前(引数ありバージョンの場合)です。境界チェック:呼び出し時に、
next()或previous()対応する要素がない場合は、例外がスローされますNoSuchElementException。変更操作の制限:を呼び出す
add()、remove()或set()前に、必ず を呼び出す必要がありますnext()或previous()。そうしないと例外がスローされますIllegalStateException。
Iterator との違い
| 特性 | Iterator | ListIterator |
|---|---|---|
| 走査方向 | 単方向(前方のみ) | 双方向(前方と後方) |
| 変更メソッド | remove() のみ | add(), remove(), set() |
| インデックスの取得 | 非対応 | nextIndex() と previousIndex() に対応 |
| 作成方法 | iterator() | listIterator() |
パフォーマンスに関する考慮事項
LinkedListのlistIterator()メソッドの時間計算量は O(1) です。新しいイテレータオブジェクトを作成するだけだからです。- イテレータ自体の各種操作(例:
next()、previous())の時間計算量は O(1) です。なぜならLinkedListは双方向リンクリストに基づいて実装されているからです。 - リストの途中で頻繁に挿入や削除を行う必要があるシナリオでは、
ListIteratorを使用すると、インデックスによる直接操作よりも効率的です。
まとめ
LinkedListのlistIterator()メソッドは通常のイテレータよりも強力な機能を提供し、走査中にリンクリストの内容を変更する必要がある場合や双方向の走査が必要な場合に特に適しています。このメソッドを理解して使いこなせば、より効率的に を操作できます。LinkedList。
Java LinkedList