1. ホーム

[解決済み】ArrayListの反復処理と要素の削除でjava.util.ConcurrentModificationExceptionを回避する方法

2022-04-02 11:30:05

質問

ArrayListを反復処理したい。反復処理中に、同時に要素を削除する必要があります。明らかに、これは java.util.ConcurrentModificationException .

この問題を処理するためのベストプラクティスは何でしょうか?最初にリストのクローンを作成すべきでしょうか?

ループ内ではなく、別の箇所で要素を削除しています。

私のコードは次のようなものです。

public class Test() {
    private ArrayList<A> abc = new ArrayList<A>();

    public void doStuff() {
        for (A a : abc) 
        a.doSomething();
    }

    public void removeA(A a) {
        abc.remove(a);
    }
}

a.doSomething を呼び出すかもしれません。 Test.removeA() ;

解決方法は?

2つの選択肢があります。

  • 削除したい値のリストを作成します。 追加 をループの中でそのリストに追加し、次に originalList.removeAll(valuesToRemove) 最後に
  • を使用します。 remove() メソッドをイテレータ自体に追加します。これは、拡張されたforループが使えないことを意味することに注意してください。

2番目のオプションの例として、リストから長さが5より大きい文字列をすべて削除する。

List<String> list = new ArrayList<String>();
...
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String value = iterator.next();
    if (value.length() > 5) {
        iterator.remove();
    }
}