尽管使用迭代器执行删除操作,但我收到了ConcurrentModificationException。关于为什么的任何想法?
for (Iterator<Thread> iter = threads.iterator(); iter.hasNext();) {
Thread hook = iter.next();
if(someCondition){
iter.remove();
}
}
答案 0 :(得分:2)
来自JavaDoc Iterator.remove():
从底层集合中删除返回的最后一个元素 迭代器(可选操作)。此方法只能调用一次 每次打电话给下一个。如果是,则未指定迭代器的行为 迭代正在进行时修改底层集合 除了通过调用此方法之外的任何其他方式。
似乎行为依赖于集合。同样正如aioobe
所指出的那样。当我在其他地方修改集合时,我可以重现ConcurrentModificationException
。仅使用Iterator
界面,我只能重现IllegalStateException
。
答案 1 :(得分:1)
因为您对使用Iterator进行了并发修改,因此不支持。迭代列表克隆,或使用CopyOnWriteArrayList。
或记忆新列表中要删除的内容,然后调用list.removeAll(whatIWantedToRemove)。