【发布时间】:2020-01-09 15:49:19
【问题描述】:
迭代器不支持 remove 方法。
但为什么它在增强的for循环中起作用?
List<String> lst = new CopyOnWriteArrayList<>();
lst.add("one");
lst.add("two");
lst.add("three");
for (String str : lst) {
if (str.equals("one")) {
lst.remove("two"); // no ConcurrentModificationException
}
}
System.out.println(lst); // [one, three] => removed "two" !
List<String> lst = new ArrayList<>(); 会生成ConcurrentModificationException
Javadoc 明确指出CopyOnWriteArrayList.iterator() 不支持remove() => 它将抛出UnsupportedOperationException!我知道它是弱一致的 - 如果我在从 CopyOnWriteArrayList
ConcurrentModificationException
附: 抱歉,我没有专心——我没有在迭代器上调用 remove()!我被内部增强型弄糊涂了(它隐式使用了迭代器)。
【问题讨论】:
-
注意代码在列表本身而不是迭代器上调用
remove(),因此代码与上面的引号不匹配。报价准确。 -
@jaco0646 这应该是答案!对不起,我不专心。当然,CopyOnWriteArrayList 是弱一致的,因此 ConcurrentModificationException 是不可能的!
标签: java for-loop iterator copyonwritearraylist