使用集合删除方法时,Java并发修改异常未到来

时间:2017-09-24 13:42:37

标签: java arraylist collections concurrentmodification

我在很多地方都看到它说在迭代时从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);     
}

1 个答案:

答案 0 :(得分:6)

您的示例不会抛出异常。 但它也不会从列表中删除所有元素。

它的真正含义

  • 在第一次迭代时,它删除索引0;列表中仍有2个元素
  • 在第二次迭代中,它删除索引1(实际上是最后一个元素); 1个元素仍然是
  • 第三次迭代不会发生,因为那时list.size()是1,小于2

起初,我认为它会抛出IndexOutOfBoundsException,但是在每次迭代开始时评估list.size()的事实确保它不会。

为什么它不抛出ConcurrentModificationException

因为你没有使用迭代器。

如果使用迭代器迭代列表,然后修改(例如从中删除)列表然后尝试推进迭代器,则抛出此异常,如下所示:

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

正如@Ferrybig所指出的那样,即使在这种情况下,迭代器也可能不会抛出异常 - 请参阅related question