为什么我在迭代ArrayList时删除元素时没有收到ConcurrentModificationException异常

4
我正在使用以下代码循环遍历一个数组列表,然后从数组列表中删除一个元素。
在这里,我期望会出现ConcurrentModificationException异常。但是没有得到这个异常,特别是当你用(n-1)th元素检查条件时。请帮帮我。下面是我的代码。
    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);

提前致谢


它并不是百分之百可靠的。如果发现修改,就会抛出异常,但并不总是会被注意到。 - Kayaman
如果我将“45”更改为“25”,那么异常就会被抛出。 - Sweeper
1
使用 iterator.remove(); 来替代抛出异常。 - Another coder
1个回答

3
实现会尽最大努力检测并发修改,但有时会失败。 ArrayListIterator返回的实现在next()remove()中检查并发修改,但不在hasNext()中检查,并发修改的逻辑是:
public boolean hasNext() {
    return cursor != size;
}

由于您在Iterator的游标位于最后一个元素之前的元素时删除了一个元素,因此删除将导致hasNext()返回false(因为在删除后size等于cursor),这会在不抛出异常的情况下结束您的循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接