码迷,mamicode.com
首页 > 编程语言 > 详细

java中在for循环中remove元素时的陷阱

时间:2020-02-15 09:26:12      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:als   方式   div   system   ring   bsp   imp   lan   nbsp   

java.util.ConcurrentModificationException

如果删空了,会报上面这个异常

输出结果如下:
remove前集合数据:a,a,b,a,a,

remove后集合数据:a,b,a,

为什么会出现这种情况?原因是集合的大小是动态变化的,在删除第1个值为“a”的元素后,集合的大小已经发生了改变,但是i的值在删除后继续执行了加1操作,此时已经跳过了“a”元素后的元素(即原集合中第2个“a”元素)。

 

如下删除集合中值为“a”的元素时:

import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //删除集合中值为“1”的数据
        for (int i = 0; i < list.size(); i++) {
            if ("a".equals(list.get(i))) {
                list.remove(i);
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 

解决方法:

1、在执行完remove操作后,对i的值进行减1操作,即修改后的代码如下:
import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //删除集合中值为“a”的数据
        for (int i = 0; i < list.size(); i++) {
            if ("a".equals(list.get(i))) {
                list.remove(i);
                i--;
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 

2、用迭代器的方式删除数据
import java.util.*;
 
public class Demo {
    
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("a");
        
        System.out.print("remove前集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        
        //删除集合中值为“a”的数据
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()) {
            String temp = iter.next();
            if ("a".equals(temp)) {
                iter.remove();
            }
        }
        
        System.out.println("");
        System.out.print("remove后集合数据:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
    }
}

 

java中在for循环中remove元素时的陷阱

标签:als   方式   div   system   ring   bsp   imp   lan   nbsp   

原文地址:https://www.cnblogs.com/moonsoft/p/12310439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!