• java foreach循环删除报错


    1、使用foreach 进行删除数据时,出现错误:

      List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            list.add("3");
            for (String temp : list) {
                if ("3".equals(temp)) {
                    list.remove(temp);
                }
            }
            System.out.println(list.toString());

    出现错误:

    java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
        at java.util.ArrayList$Itr.next(ArrayList.java:831)

    原因:

    foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。这个是为了安全的考虑。如果使用iterator遍历过程中,使用List修改了元素,可能会出现不正常的现象。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行,如下代码所示:

        public void remove() {
                if (lastRet < 0)
                    throw new IllegalStateException();
                checkForComodification();
    
                try {
                    ArrayList.this.remove(lastRet);
                    cursor = lastRet;
                    lastRet = -1;
                    expectedModCount = modCount;
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }

    2、正常删除代码如下:不使用foreach

      List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            list.add("3");
            Iterator<String> iterator = list.iterator();
            while(iterator.hasNext()){
                if (iterator.next().equals("3")){
                    iterator.remove();
                }
            }
    
            System.out.println(list.toString());
    工作小总结,有错请指出,谢谢。
  • 相关阅读:
    jdk1.8 LongAdder源码学习
    linux 下 vi 文本编辑如何复制一行粘贴删除一行数据
    远程调试
    本机与远程主机指定端口的网络是否连通
    自定义弹窗
    Windows查看占用端口的进程及其对应的应用程序并关闭之
    超实惠:99元阿里云服务器1核2G内存40G硬盘(SSD)
    Java显式锁学习总结之六:Condition源码分析
    Maven使用国内镜像
    深入理解读写锁—ReadWriteLock源码分析
  • 原文地址:https://www.cnblogs.com/zilanghuo/p/6677851.html
Copyright © 2020-2023  润新知