常常会遇到这样一种状况,对集合类里的元素进行判断,符合条件的元素保留,不符合条件的元素删除。请注意在删除的时候,务必使用迭代器Iterator。java
常见错误1:oop
ArrayList<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("陈六");
for(String s : list){
if(s.equals("张三")){
list.remove(s);
}
}
System.out.println(list);spa
抛出异常:java.util.ConcurrentModificationExceptionrem
常见错误2:get
ArrayList<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");//被跳过判断
list.add("陈六");
int loopConut = 0;//循环次数
for(int i =0;i<list.size();i++){
loopConut++;
if(list.get(i).equals("李四")){
list.remove(i);
}
}
System.out.println(loopConut);//3
System.out.println(list);//[张三, 王五, 陈六]it
注意:这种方式不会抛出异常,可是会出大事。首先,若是在for循环中执行remove操做,致使list的size数量减小,那么被删除元素的下一个元素则会跳过判断。除非在删除元素后,对i进行操做。io
正确方式:for循环
ArrayList<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("陈六");
Iterator<String> it = list.iterator();
int loopCount = 0;//循环次数
while(it.hasNext()){
loopCount++;
String name = it.next();//必须先it.next(),才能it.remove(),
System.out.println(name);
if(name.equals("张三")){
it.remove();
}
}
System.out.println(loopCount);//4
System.out.println(list);List