JAVA List循环中删除元素

案例

将list中 姓李的 全部删除掉

java.util.List<String> list=new ArrayList();
list.add("杨洋");
list.add("李四");
list.add("鹿晗");
list.add("李雷");
list.add("李现");

方式一(不能删除干净)

通过for语句循环

for(int i=0;i<list.size();i++){
    String e=list.get(i);
    if(e.startsWith("李")){
        list.remove(e);
    }
}
System.out.println(list);

执行结果:

[吴亦凡, 鹿晗, 李现]

因为删除 姓李的,导致 list.size() 长度变短,不会循环到最后一次

方式二(报错)

为了改上面的bug,将 list.size() 单独拿出来,如下:

int size=list.size();
System.out.println("size:"+size);
for(int i=0;i<size;i++){
    String e=list.get(i);
    if(e.startsWith("李")){
        list.remove(e);
    }
}

执行报错如下:

size:5
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

list长度原本是 5,因为删除 姓李的,此时list中只有3个元素,当循环第4次时会报错

方式二(修复上面bug)

为了修复上面的bug,移除数据后,size--,i--

int size=list.size();
System.out.println("size:"+size);
for(int i=0;i<size;i++){
    String e=list.get(i);
    if(e.startsWith("李")){
        list.remove(e);
        size--;
        i--;
    }
}
System.out.println(list);

方式三(报错)

for(String e:list){
    if(e.startsWith("李")){
        list.remove(e);
    }
}

执行报错:

Exception in thread "main" java.util.ConcurrentModificationException

在for each循环中,修改list会报错

方式三(推荐)

从后向前循环,元素相同就删除,但i减小,所以不会引发list越界

for(int i=list.size()-1;i>=0;i--){
    String e=list.get(i);
    if(e.startsWith("李")){
        list.remove(e);
    }
}
System.out.println(list);

方式四(推荐)

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String value = it.next();
    if (e.startsWith("李")) {
        it.remove();
    }
}

原文出处:/show_1EF4tqgUL3LA.html