Java LinkedList remove() メソッド

Java LinkedList


remove()メソッドは JavaLinkedListクラスの重要なメソッドで、リンクリストから要素を削除するために使用されます。LinkedList は Java コレクションフレームワークの一部であり、List および Deque インターフェースを実装しています。

remove()このメソッドにはいくつかの異なる形式があり、それぞれに特定の用途があります:

E remove()           // リストの最初の要素を削除して返します
E remove(int index)  // 指定された位置の要素を削除します
boolean remove(Object o) // 指定された要素の最初の出現を削除します

メソッドの詳細

remove() - 引数なし形式

例

public E remove()

機能:このリストの最初の要素を削除して返します。

パラメータ:なし

戻り値:削除された要素

例外:リストが空の場合、スローされますNoSuchElementException

例:

例

LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");

String first = list.remove(); // "Apple" を削除して返します
System.out.println("Removed: " + first); // 出力: Removed: Apple
System.out.println(list); // 出力: [Banana, Cherry]

remove(int index) - インデックス引数付き

例

public E remove(int index)

機能:リスト内の指定された位置にある要素を削除します。

パラメータ:

  • index- 削除する要素のインデックス

戻り値:削除された要素

例外:

  • IndexOutOfBoundsException- インデックスが範囲外の場合 (index < 0 || index >= size())

例:

例

LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);

int removed = numbers.remove(1); // インデックス1の要素(20)を削除します
System.out.println("Removed: " + removed); // 出力: Removed: 20
System.out.println(numbers); // 出力: [10, 30]

remove(Object o) - オブジェクト引数付き

例

public boolean remove(Object o)

機能:リスト内で最初に出現する指定された要素を削除します(存在する場合)。

パラメータ:

  • o- リストから削除する要素(存在する場合)

戻り値:

  • true- リストが指定された要素を含む場合は true
  • false- リストが指定された要素を含まない場合は false

例:

例

LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Apple");

boolean result = fruits.remove("Apple"); // 最初の "Apple" を削除します
System.out.println("Removed? " + result); // 出力: Removed? true
System.out.println(fruits); // 出力: [Banana, Apple]

メソッドの比較

メソッドの形式 パラメータの型 戻り値 例外 用途
remove() 无 E(要素型) NoSuchElementException 最初の要素を削除して返す
remove(int index) int E(要素型) IndexOutOfBoundsException 指定された位置の要素を削除する
remove(Object o) Object boolean 无 指定された要素の最初の出現を削除する

使用上の注意

パフォーマンスの考慮

LinkedList のremove()メソッドのさまざまな状況におけるパフォーマンスの挙動:

  1. 先頭の要素を削除 (remove() 或 remove(0)):O(1) 時間計算量
  2. 末尾の要素を削除 (remove(size()-1)):O(1) 時間計算量
  3. 中間の要素を削除:O(n) 時間計算量。指定された位置まで走査する必要があるため

並行変更

イテレータで LinkedList を走査中にremove()メソッドを呼び出すと、ConcurrentModificationException が発生する可能性がありますConcurrentModificationException。正しい方法は、イテレータ自体のremove()メソッドを使用することです。

誤った例:

例

LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3));
for (Integer num : list) {
    if (num == 2) {
        list.remove(num); // ConcurrentModificationException がスローされる可能性があります
    }
}

正しい方法:

例

Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    Integer num = it.next();
    if (num == 2) {
        it.remove(); // イテレータの remove() メソッドを使用します
    }
}

null 値の処理

LinkedList は null 値の格納を許可しており、remove(null) を使用してremove(null)リスト内の null 要素を削除できます。

例

LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add(null);
list.add("B");

list.remove(null); // null 要素を削除します
System.out.println(list); // 出力: [A, B]

実際の応用例

キューの実装

LinkedList のremove()メソッドは、キューの FIFO(先入れ先出し)特性を実装するために使用できます:

例

LinkedList<String> queue = new LinkedList<>();
queue.add("Task1");
queue.add("Task2");
queue.add("Task3");

while (!queue.isEmpty()) {
    String task = queue.remove(); // 最初の要素を削除して返します
    System.out.println("Processing: " + task);
}

特定の条件に一致する要素の削除

例

LinkedList<Integer> numbers = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5, 6));

// すべての偶数を削除します
numbers.removeIf(n -> n % 2 == 0);
System.out.println(numbers); // 出力: [1, 3, 5]

ArrayList の remove() との比較

例

// LinkedList の remove() は中間位置でのパフォーマンスが良好です
LinkedList<Integer> linkedList = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
linkedList.remove(2); // 比較的効率的です

// ArrayList の remove() は中間位置で要素の移動が必要です
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
arrayList.remove(2); // 後続の要素を移動する必要があります

まとめ

LinkedList のremove()メソッドは、さまざまな削除ニーズを満たすための複数の形式を提供します:

  1. remove()- 先頭の要素をすばやく削除でき、キューの操作に適しています
  2. remove(int index)- 削除する要素の位置を正確に制御できます
  3. remove(Object o)- 要素の値に基づいて削除できます

実際のアプリケーションでは、具体的なニーズに応じて適切なメソッド形式を選択し、それらのパフォーマンス特性や例外に注意する必要があります。これらのメソッドの違いと適用シーンを理解することで、LinkedList という重要なコレクションクラスをより効果的に使用できるようになります。

Java LinkedList

その他の拡張