【发布时间】:2016-01-15 11:48:31
【问题描述】:
我有stumbled upon this code,它会抛出一个ConcurrentModificationException
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a"))
list.remove(s);
}
如果你添加一个迭代器并使用一个while循环,代码可以正常工作:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
我不明白,为什么有必要在这种情况下使用Iterator<String>。
是不是因为 ArrayList 没有某种迭代能力,尽管它是 subclass of Collection?
是否有必要使用 while 循环,或者你可以生成一个带有 for 循环的版本?
【问题讨论】:
-
来自docs.oracle.com/javase/tutorial/collections/interfaces/…:Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了底层集合,则行为未指定。