我在很多地方都看到它说在迭代时从ArrayList中删除一个元素时,我应该使用iterator remove方法而不是collections remove方法来避免并发修改异常。
但是,下面的代码可以正常使用Java 1.8 Collection remove而不会给出并发修改异常。你可以看到我在这里没有使用迭代器来删除对象。
List<MyObject> list = new ArrayList<MyObject>();
list.add(new MyObject());
list.add(new MyObject());
list.add(new MyObject());
for (int i=0; i<list.size(); i++) {
list.remove(i);
}
答案 0 :(得分:6)
您的示例不会抛出异常。 但它也不会从列表中删除所有元素。
list.size()
是1,小于2 起初,我认为它会抛出IndexOutOfBoundsException
,但是在每次迭代开始时评估list.size()
的事实确保它不会。
ConcurrentModificationException
因为你没有使用迭代器。
如果使用迭代器迭代列表,然后修改(例如从中删除)列表然后尝试推进迭代器,则抛出此异常,如下所示:
Iterator<MyObject> it = list.iterator();
while (it.hasNext()) {
list.remove(it.next());
}
正如@Ferrybig所指出的那样,即使在这种情况下,迭代器也可能不会抛出异常 - 请参阅related question。