【发布时间】:2015-09-01 04:13:19
【问题描述】:
我在测试ConcurrentModificationException 概念之后编写了这个示例:
public class Person
{
String name;
public Person(String name)
{
this.name = name;
}
}
public static void main(String[] args)
{
List<Person> l = new ArrayList<Person>();
l.add(new Person("a"));
l.add(new Person("b"));
l.add(new Person("c"));
int i = 0;
for(Person s : l)
{
if(s.name.equals("b"))
l.remove(i);
i++;
}
for(Person s : l)
System.out.println(s.name);
}
当我执行上面的 main 方法时,ConcurrentModificationException 不会被抛出,输出控制台会打印以下结果:
a
c
根据我对这个问题的了解,在列表循环中,修改列表时,应该抛出 ConcurrentModificationException 异常。但是为什么在我的示例中没有出现这种情况?
【问题讨论】:
-
没有保证对列表的结构修改会抛出
ConcurrentModificationException。 -
可能是因为 ArrayList 的实现细节。阅读stackoverflow.com/questions/18448671/…
-
因为您的循环在
remove之后立即退出。如果在“c”之后添加第 4 个元素或删除 Person“a”,则会出现异常。 -
@Marvin 指出了这种行为。
标签: java collections concurrentmodification