建议使用迭代器来删除list中指定的元素
1.普通for循环
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
for(int i=0;i<list.size();i++){
if(list.get(i).equals("two")){
list.remove(i);
}
}
System.out.println(list);
}
输出结果:
[one, two, two]
分析:
list中有四个”two”,但是为什么结果还有2个”two”呢?
普通for遍历,当遍历到第一个”two”的时候匹配上, 删除第一个”two”。这时候,索引指向下一个”two”,并执行i++操作,从而导致第二个”two”没法被删掉。
改进方法:
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("two")){
list.remove(i);
i--;
}
为避免错误,不建议使用这种方法来处理。建议使用迭代器来删除指定元素。
第二种方法 增强for
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
for(String s:list){
if(s.equals("two")){
list.remove(s);
}
}
System.out.println(list);
}
输出结果:
Exception in thread “main” java.util.ConcurrentModificationException
分析:增强for循环不能对集合本身进行操作
第三种方法 迭代器
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
//这里使用ListIterator也可以删除成功
Iterator<String> iterator=list.iterator();
while (iterator.hasNext()){
String s=iterator.next();
if(s.equals("two")){
iterator.remove();
}
}
System.out.println(list);
}
输出结果:
[one]
分析:
而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历。