当想要删除list中的元素时想到3种方法,for循环、增强for循环、迭代器循环遍历,但其实有的操作是不能得到正确结果的。
首先初始化要操作的数据
public static void init(){
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println("初始化:"+list.size());
}
for循环
for (int i = 0; i < list.size(); i++) {
System.out.println("第"+i+"次删除");
System.out.println("list长度:"+list.size());
if (i<5) {
list.remove(i);
}
}
然而程序运行结果并不是执行了5次remove(),
第0次删除
list长度:5
第1次删除
list长度:4
第2次删除
list长度:3
增强for循环
删除元素后继续循环会报错误信息java.util.ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出, 则不会触发报错,跳出循环这就意味着后面有匹配的元素也不能删除了。
for(String string :list){
if (string.equals("b")) {
list.remove(string);
break;
}
}
迭代器删除
使用迭代器删除元素就不会遇到上面的问题了,下面的代码会把list中所有的“a”全部删除。
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
if (string.equals("a")) {
iterator.remove();
}
}
结论
前两种方法在删除单个指定元素的时候是可以的,当删除多个元素的时候就会出现问题,迭代器的话是单个多个删除都没有问题的,所以在删除的时候应该使用第三种方法。