4

次のコードを使用して arraylist をループし、arraylist から 1 つの要素を削除しています。

ここで私は ConcurrentModificationException を期待しています。しかし、その例外はありませんでした。特に(n-1)番目の要素で条件をチェックしている場合。私を助けてください。以下は私のコードです。

    ArrayList<Integer> arrayList = new ArrayList<Integer>();

    for (int i = 1; i <= 10; i++) {
        arrayList.add(5 * i);
    }
    System.out.println(arrayList);

    Iterator<Integer> iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        Integer temp = iterator.next();
        if (temp == 45) {
            /**
             * temp == 40 (then i'm getting *ConcurrentModificationException) why not i'm
             * getting ConcurrentModificationException if (temp == 45)
             */
            arrayList.remove(1);
        }
    }
    System.out.println(arrayList);

前もって感謝します

4

1 に答える 1

3

実装は、同時変更を検出するために最善を尽くしますが、検出に失敗する場合があります。

Iterator実装は、 と での同時変更のチェックを返しましたArrayListIterator、ではそうではありません。そのロジックは次のとおりです。next()remove()hasNext()

public boolean hasNext() {
    return cursor != size;
}

Iteratorのカーソルが最後の要素の前の要素にあったときに要素を削除したため、削除によりhasNext()戻りが発生しfalse(削除後にsizeと等しくなるためcursor)、例外をスローせずにループが終了します。

于 2019-10-10T09:49:11.820 に答える