zoukankan      html  css  js  c++  java
  • java中在for循环中remove元素时的陷阱

    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)+",");
            }
        }
    }
  • 相关阅读:
    安装composer后报错proc_open(): fork failed
    ZOJ4063 Tournament [The 2018 ACM-ICPC Asia Qingdao Regional Contest]
    BZOJ1191: [HNOI2006]超级英雄Hero
    BZOJ1270: [BeijingWc2008]雷涛的小猫
    BZOJ1303 [CQOI2009]中位数图
    BZOJ1192 [HNOI2006]鬼谷子的钱袋
    BZOJ1003 [ZJOI2006]物流运输 最短路+DP
    牛客国庆集训派对Day6 E-Growth
    BZOJ2208 [Jsoi2010]连通数
    BZOJ2761 [JLOI2011]不重复数字
  • 原文地址:https://www.cnblogs.com/moonsoft/p/12310439.html
Copyright © 2011-2022 走看看