在遍历删除集合中的元素时,如何避免ConcurrentModificationException?

在遍历删除集合中的元素时,会发送ConcurrentModificationException,比如以下代码。

for (Integer i : list) {
    if (== 1) {
        list.remove(i);
    }
}

运行后出现错误Exception in thread "main" java.util.ConcurrentModificationException,那如何删除集合中的元素才能避免出现这个错误呢?

ConcurrentModificationExceptionArrayListremoveCollectionIterator
1
231
已修改
小课
小课2022-05-14 16:02
1 个回答

这个错误出现的原因是因为fail-fast机制,不过它主要是针对多线程的环境下,在集合类遍历过程中,发现自己遍历的集合已经被修改过,可能是本线程也有可能是其它线程进行的修改,出现这种情况,有两种方式处理,一种是继续遍历,这样可能会留下隐患,因为集合发生了变化,不确定这种变化是否是调用者可接受的,另外一种是抛出异常信息,告诉调用者该集合在遍历过程中被修改了,这种处理方式就是fail-fast机制。

如果想要在遍历的过程中删除元素,可以使用Iterator的方式来删除,即删除的时候调用Iterator#remove方法,如下

Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    if (it.next() == 1) {
       it.remove();
    }
}

如果仅仅是删除,在Java 8及以上版本,还可以使用removeIf方法,它内部使用的就是Iterator#remove的方式。

list.removeIf(-> i == 1);

不过需要记住的是在多线程环境下,如果在遍历过程中当前集合被其它线程修改了,仍然还是会抛出异常。

1
已修改
小课
小课2022-05-14 16:38
你的回答

内容