凡不是就着泪水吃过面包的人是不懂得人生之味的人——歌德

我们在list循环中调用remove函数删除自身元素可能会导致java.util.ConcurrentModificationException

例如

1
2
3
4
// 构造从0到20的list
List<Integer> list = Stream.iterate(0, i -> ++i).limit(20).collect(Collectors.toList());
// 删除
list.forEach(list::remove);

首先我们可以使用removeIf代替

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

其次我们可以使用迭代器

我们可以看到removeIf的源码正是使用了迭代器

image-20210305223612389

如下

1
2
3
4
5
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer nowNumber = iterator.next();
iterator.remove();
}

在无法使用removeIf的场景下即可使用Iterator下的remove()方法