Java:在for-each循环中删除List中的记录时出现异常

Tha*_*ham 3 java list arraylist

我有一个List,我想循环遍历该List并在某些条件下删除一些记录库.这就是我的工作

public void foo(List<Bar> recordList){
     for(Bar bar : recordList){
         if(bar.someCondition()){
              recordList.remove(bar);
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

此代码生成异常.如果我使用Iterator,那么它工作正常

public void foo(List<Bar> recordList){
     Iterator<Bar> iter = recordList.iterator();
     while(iter.hasNext()){
         Bar bar = iter.next();
         if(bar.someCondition()){
              iter.remove();
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

我猜我的问题:

  1. 为什么第一段代码不起作用?

  2. 如何使第一段代码工作?

Kal*_*Kal 10

文档非常明确.

http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException.因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险.


Viv*_*sse 6

  1. 它不起作用,因为您正在修改一个集合,而不是迭代它.这意味着您正在改变其状态并同时阅读它.这会在集合的内部引发意外行为,并且为了防止数据损坏,会抛出异常.

  2. 你不能让它发挥作用.你必须使用迭代器.