在遍历删除集合中的元素时,会发送ConcurrentModificationException,比如以下代码。
for (Integer i : list) {
if (i == 1) {
list.remove(i);
}
}
运行后出现错误Exception in thread "main" java.util.ConcurrentModificationException,那如何删除集合中的元素才能避免出现这个错误呢?
这个错误出现的原因是因为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 -> i == 1);
不过需要记住的是在多线程环境下,如果在遍历过程中当前集合被其它线程修改了,仍然还是会抛出异常。
内容