java - 为什么我在迭代期间从 ArrayList 中删除元素时没有得到 ConcurrentModificationException

标签 java arraylist concurrency fail-fast java-failsafe

<分区>

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

这里我期待 ConcurrentModificationException。但没有得到那个异常(exception)。特别是当您使用第 (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);

提前致谢

最佳答案

该实现尽最大努力检测并发修改,但在某些情况下它无法做到这一点。

ArrayListIterator 返回的 Iterator 实现检查 next()remove(),但hasNext()中没有,其逻辑为:

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

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

关于java - 为什么我在迭代期间从 ArrayList 中删除元素时没有得到 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58319973/

相关文章:

java - 如何让 eclipse 在可完成的 future 中报告未报告的异常?

java - 简单的 JasperReport 查询

java - 添加附加项目后 ListView 不刷新

c++ - 为什么 sleep() 会阻塞 std::ostream

java - 如何使用ReentrantReadWriteLock等待数据?

java - 按后退按钮停止媒体播放器

java - CDI 2.0 : How to check how many asynchronous events fired with Event. fireAsync() 可以同时运行

java - 如何从 Java 中的对象 ArrayList 获取 ArrayList 值?

java - 从java中的Arraylist中的列表中删除重复项

java - 我可以使 ProgressMonitor 对话框成为模态吗?