为什么以下代码抛出java.util.ConcurrentModificationException ??
有人可以解释一般的ConcurrentModificationException并参考这段代码! 感谢。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
for(String s : list){
if(s.equals("a"));
list.remove("a");
}
System.out.println(list);
}
}
答案 0 :(得分:1)
我会保持简单
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
int i;
//Go through each element of list
for (i = 0; i < list.size(); i++)
{
//Test if element needs deleting
if (list.get(i).equals("a")){
//Delete element
list.remove(i);
//Update reference given element deleted
i--;
}
}
System.out.println(list);
}
}
答案 1 :(得分:0)
在迭代集合时,您无法修改集合的内容,因为这会使迭代失效。这样做会导致ConcurrentModificationException。
行
list.remove("a");
在迭代中并导致异常。
答案 2 :(得分:0)
正如它所说:
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出 ConcurrentModificationException 。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。
可以通过明确使用Iterator
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
if (it.next().equals("a")) {
it.remove();
}
}
使用简单的for-each循环,你无权访问迭代器(但它用于运行这样的循环),因此你不能进行任何结构修改。