我有一个List,我想循环遍历该List并在某些条件下删除一些记录库。这是我做的事情
public void foo(List<Bar> recordList){
for(Bar bar : recordList){
if(bar.someCondition()){
recordList.remove(bar);
}
}
}
此代码生成异常。如果我使用Iterator,那么它可以正常工作
public void foo(List<Bar> recordList){
Iterator<Bar> iter = recordList.iterator();
while(iter.hasNext()){
Bar bar = iter.next();
if(bar.someCondition()){
iter.remove();
}
}
}
我想我的问题是:
为什么第一段代码不起作用?
如何让第一段代码生效?
答案 0 :(得分:10)
文档非常明确。
http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外, < / strong>迭代器将抛出ConcurrentModificationException。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。
答案 1 :(得分:6)
它不起作用,因为您正在修改集合,而不是迭代它。这意味着您正在改变其状态并同时阅读它。这会在集合的内部引发意外行为,并且为了防止数据损坏,会抛出异常。
你没有成功。你必须使用迭代器。