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()本身的方法即可.
     
  • 相关阅读:
    python同时继承多个类且方法相同
    django扩展用户继承AbstractUser
    python中单下划线和双下划线
    django扩展用户一对一关联
    django拓展用户proxy代理
    django 内置User对象基本使用
    selenium+pthon之二----了解浏览器的相关操作方法
    最近很燥,决心沉下心来学习!
    selenium+pthon之一----环境搭建与脚本实例
    Fiddler入门三
  • 原文地址:https://www.cnblogs.com/robotsu/p/11486139.html
Copyright © 2011-2022 走看看