当我执行以下代码安静时,我想知道幕后真的发生了什么:
List<Object> list = new ArrayList<Object>();
fillTheList(); // Filling a list with 10 objects
int count = 0;
for (Object o : list) {
count++;
if (count == 5) {
list.remove(count);
}
o.toString();
}
删除元素后,我收到ConcurrentModificationException
异常。
我不明白为什么在删除它之后的一个元素不可能只是在集合中使用下一个元素并继续循环。
答案 0 :(得分:7)
获取Iterator
而不是在for
循环中使用迭代器:
int count = 0;
for(final Iterator iterator = list.iterator(); iterator.hasNext();) {
final Object o = iterator.next();
if (++count == 5) {
iterator.remove();
}
o.toString();
}
编辑:您获得ConcurrentModificationException
的原因是因为for
循环使用了在您进行修改之前创建的其他Iterator
list.remove()
Iterator
内部有州。
答案 1 :(得分:1)
基本上你不允许在foreach循环中引用集合(本例中为list
)。
请改为尝试:
List<Object> list = new ArrayList<Object>();
fillTheList(); // Filling a list with 10 objects
int count = 0;
ListIterator<Object> it = list.listIterator();
while (it.hasNext()) {
Object o = it.next();
count++;
if (count == 5) {
it.remove();
}
o.toString();
}
答案 2 :(得分:0)
通常有更好的方法来执行此操作,而不是使用iterator.remove()。例如在你的情况下,循环与
相同if(list.size()> 5) list.remove(5);
如果你确实需要使用iterator.remove(),你仍然可以使用for循环。
for(Iterator iterator = list.iterator(); iterator.hasNext();) {
final Object o = iterator.next();
if (++count == 5)
iterator.remove();
o.toString();
}