zoukankan      html  css  js  c++  java
  • 有关迭代器的并发修改异常

    Iterator迭代器:
    List<String> list = new ArrayList<>();
    list.add("老马");
    list.add("老王");
    list.add("老彭");
    Iterator<String> iterator = list.iterator();
    while(iterator.hasNext()){
    if(iterator.next().equals("老王")){
    iterator.remove();//[老马, 老彭]
    list.remove("老王");//[老马, 老彭]
    //list.add("老王+");//ConcurrentModificationException
    }
    }
    System.out.println(list);
    通过List集合添加了元素,而迭代器获取元素时预期的修改值次数和实际的修改值次数不相同造成的
    (具体查看ArrayList类中iterator方法中匿名内部类Itr()里的代码实现过程).


    ListIterator迭代器:

    ListIterator<String> listIterator = list.listIterator();
    while(listIterator.hasNext()){
    if(listIterator.next().equals("老王")){
    //listIterator.remove();//[老马, 老彭]
    //listIterator.add("老李");//[老马, 老王, 老李, 老彭]
    //listIterator.set("老赵换老王");//[老马, 老赵换老王, 老彭]
    //list.remove("老王");//[老马, 老彭]
    list.add("浩仔");//ConcurrentModificationException
    }
    }
    System.out.println(list);
    通过List集合添加了元素,而迭代器获取元素时预期的修改值次数和实际的修改值次数不相同造成的
    (具体是ArrayList类中ListIterator方法中匿名内部内ListItr()继承了他的父类Itr()所以具体情况差不多大同小异)
    如果想在ListIterator迭代器中进行删改还不产生并发异常,直接调用ListIterator()本身的方法即可.
     
  • 相关阅读:
    Spring Boot之@ImportResource、配置类、占位符表达式
    Spring Boot之测试类报错问题
    Spring Boot之@EnableAutoConfiguration源码解读
    Spring Boot之第一个程序及执行原理。
    eclipse中git使用中的冲突解决
    python画国旗
    第十六周进度
    个人课程总结
    人月神话之阅读笔记03
    第十五周进度
  • 原文地址:https://www.cnblogs.com/robotsu/p/11486139.html
Copyright © 2011-2022 走看看