zoukankan      html  css  js  c++  java
  • 大杂烩 -- Iterator 并发修改异常ConcurrentModificationException

    基础大杂烩 -- 目录

    大杂烩 -- Java中Iterator的fast-fail分析

    大杂烩 -- Iterator 和 Iterable 区别和联系

    问题: 
    在集合中,判断里面有没有"Hello"这个元素,如果有,我就添加一个"It's me"元素。

    使用普通迭代器出现的异常: 
    ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 

    产生的原因: 
    迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。 
    其实这个问题描述的是:普通迭代器遍历元素的时候,通过集合是不能修改元素的。 

    解决: 
    A:迭代器迭代元素,迭代器修改元素 
       元素是跟在刚才迭代的元素后面的。 
    B:集合遍历元素,集合修改元素(普通for循环进行遍历,forEach依旧是基于迭代器) 
       元素是在最后添加的。

    package limeMianShi.iterator_;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    
    public class It_modify_for_modify {
    
        public static void main(String[] args) {
            List<String> forStyle = new ArrayList<String>();
            List<String> iteratorStyle = new ArrayList<String>();
    
            Iterator<String> iterator = null;
    
            forStyle.add("Hello");
            forStyle.add("World");
            iteratorStyle.add("Hello");
            iteratorStyle.add("World");
            System.out.print("forStyle---	");
            for (int i = 0; i < forStyle.size(); i++) {
                if ("Hello".equals(forStyle.get(i)))
                    forStyle.add("It's me");
            }
            iterator = forStyle.iterator();
            while (iterator.hasNext())
                System.out.print(iterator.next() + " ");
            System.out.println();
    
            System.out.print("iteratorStyle---	");
            ListIterator<String> listIterator = iteratorStyle.listIterator();
            while (listIterator.hasNext()) {
                if ("Hello".equals(listIterator.next()))
                    listIterator.add("It's me");
            }
            iterator = iteratorStyle.iterator();
            while (iterator.hasNext()) {
                System.out.print(iterator.next() + " ");
            }
        }
    }

    原理分析:

      啦啦啦

  • 相关阅读:
    深入理解JavaScript中的this关键字
    使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹
    使用 BEGINCONTENT() 和 ENDCONTENT() 设定 YII 的 LAYOUTS
    孙悟空的师傅是谁
    PHP MemCached高级缓存配置图文教程
    C++中的基类与派生类
    矩阵快速幂
    华为上机测试题
    2016网易研发题目
    冒泡排序
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7092033.html
Copyright © 2011-2022 走看看