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()本身的方法即可.
     
  • 相关阅读:
    C# using 实现强制资源清理
    MySQL workbench How to create a new model
    无法启动windows audio服务,错误提示126.
    Process of knowledge discovery in databases
    Android 应用程序中资源的引用
    Javadoc使用方法
    Android xml 布局
    load data with matlab
    Android中string.xml使用总结
    Introduction to Indigo
  • 原文地址:https://www.cnblogs.com/robotsu/p/11486139.html
Copyright © 2011-2022 走看看