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()本身的方法即可.
     
  • 相关阅读:
    JAVA数组复制和扩容
    Nginx-fastdfs安装与配置
    ssh安全免密登录
    修改Linux默认源
    Linux查看IP
    整合ssm框架
    Java-maven-shangcheng-parent-web-配置
    Java-maven-shangcheng-manager-service-配置
    Java-maven-shangcheng-manager-配置
    jquery美化select,自定义下拉框样式
  • 原文地址:https://www.cnblogs.com/robotsu/p/11486139.html
Copyright © 2011-2022 走看看