List循环中正确删除元素
List在循环时我们需要根据条件删除该List中满足条件的元素,最先想到的是按照下面的方式:
public class Demo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
System.out.println("Before :" + list);
for (String element : list) {
if (element.equals("ccc")) {
list.remove(element);
}
}
System.out.println("After :" + list);
}
}
看起来没什么问题,但是却报如下的错误:
为什么会这样?
首先Java的for循环,就是将List对象遍历托管给Iterator,你如果要对list进行增删操作,都必须经过Iterator。
其实,Iterator可以理解为一个索引,他依靠在其所要迭代的集合上,一旦使用lhm.remove,就会使原来的集合结构遭到破坏,此时原来的集合与iterator的索引结构不一致,自然iterator就会报错。而用iteraotr.remove(),iterator会自动的维护被迭代集合的索引一致性,因此能够正常运行。
修改成如下就可以正常删除:
public class Demo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
System.out.println("Before :" + list);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String element = iterator.next();
if (element.equals("ccc")) {
iterator.remove();
}
}
System.out.println("After :" + list);
}
}
结果:
Before :[aaa, bbb, ccc, ddd, eee, fff]
After :[aaa, bbb, ddd, eee, fff]