Java 使用集合删除方法时不会出现并发修改异常
Java concurrent modification exception is not coming while using collections remove method
我在很多地方看到它说在迭代时从 ArrayList 中删除元素时,我应该使用迭代器删除方法而不是集合删除方法以避免并发修改异常。
但是,下面的代码使用 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;列表中仍有 2 个元素
- 在第二次迭代中,它删除了索引 1(实际上是最后一个元素);剩余 1 个元素
- 第三次迭代不会发生,因为那时
list.size()
是 1 小于 2
起初,我以为它会抛出一个 IndexOutOfBoundsException
,但在每次迭代开始时计算 list.size()
的事实确保它不会。
为什么不抛出 ConcurrentModificationException
因为您没有使用迭代器。
如果您使用迭代器迭代列表,然后修改(例如从中删除)列表,然后尝试推进迭代器,则会抛出此异常,如下所示:
Iterator<MyObject> it = list.iterator();
while (it.hasNext()) {
list.remove(it.next());
}
正如@Ferrybig 指出的那样,即使在这种情况下,迭代器实际上也可能不会抛出异常 - 请参阅 。
我在很多地方看到它说在迭代时从 ArrayList 中删除元素时,我应该使用迭代器删除方法而不是集合删除方法以避免并发修改异常。
但是,下面的代码使用 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;列表中仍有 2 个元素
- 在第二次迭代中,它删除了索引 1(实际上是最后一个元素);剩余 1 个元素
- 第三次迭代不会发生,因为那时
list.size()
是 1 小于 2
起初,我以为它会抛出一个 IndexOutOfBoundsException
,但在每次迭代开始时计算 list.size()
的事实确保它不会。
为什么不抛出 ConcurrentModificationException
因为您没有使用迭代器。
如果您使用迭代器迭代列表,然后修改(例如从中删除)列表,然后尝试推进迭代器,则会抛出此异常,如下所示:
Iterator<MyObject> it = list.iterator();
while (it.hasNext()) {
list.remove(it.next());
}
正如@Ferrybig 指出的那样,即使在这种情况下,迭代器实际上也可能不会抛出异常 - 请参阅