4

我正在使用以下代码循环遍历数组列表,然后从数组列表中删除一个元素。

在这里,我期待 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实现检查 and 中的并发修改,但不检查 in 中ArrayList的并发修改,其逻辑是:Iteratornext()remove()hasNext()

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

由于您在Iterator' 的光标位于最后一个元素之前的元素上时删除了一个元素,因此删除会导致hasNext()返回false(因为在删除后size变为等于cursor),这会结束您的循环而不会引发异常。

于 2019-10-10T09:49:11.820 回答