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()本身的方法即可.
     
  • 相关阅读:
    假丶依赖注入
    .NET Core 傻瓜式CSRedisCore缓存
    .NET Core MD5加密 32位和16位
    数据库所对应的函数
    使用通配符进行过滤
    WHERE 子句操作符
    不同的数据库查询行数的方式
    第一课了解SQL
    微服务架构综述
    三层应用与单块架构
  • 原文地址:https://www.cnblogs.com/robotsu/p/11486139.html
Copyright © 2011-2022 走看看