如果我们有两种迭代方式:
第一的 :
Object ob;
ArrayList<Obect> list;
for(int i=0;i<list.size();i++)
{ //Todo}
第二 :
Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}
那么有什么区别呢?我发现在第二种情况下,如果尝试在这个循环中删除对象,我会得到一个并发修改异常。
如果我们有两种迭代方式:
第一的 :
Object ob;
ArrayList<Obect> list;
for(int i=0;i<list.size();i++)
{ //Todo}
第二 :
Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}
那么有什么区别呢?我发现在第二种情况下,如果尝试在这个循环中删除对象,我会得到一个并发修改异常。
在您的第一个示例中,您正在自己遍历列表。如果您在迭代期间修改集合,您必须负责维护迭代的状态。
Iterator
在您的第二个示例中,您使用的“foreach”循环在幕后使用了隐式。如果你自己用一个 active 修改集合Iterator
,你会得到一个ConcurrentModificationException
.
如果在使用 时必须删除元素Iterator
,则使用显式Iterator
:
for(Iterator<Object> itr = list.iterator(); itr.hasNext())
{
Object o = itr.next():
if (decideToRemove)
itr.remove();
}
的操作允许删除一个元素而不抛出Iterator
一个。remove
ConcurrentModificationException
从集合中删除的正确方法是使用第三种循环,如下所示:
for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext(); ) {
Object o = iterator.next();
if (someCondition())
iterator.remove();
}