zoukankan      html  css  js  c++  java
  • Java ConcurrentModificationException 异常分析与解决方案

    Java ConcurrentModificationException 异常分析与解决方案
    http://www.2cto.com/kf/201403/286536.html

    java.util.ConcurrentModificationException 解决办法 
    http://blog.csdn.net/lipei1220/article/details/9028669

    原因:Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

    // 1 使用Iterator提供的remove方法,用于删除当前元素
     for (Iterator<string> it = myList.iterator(); it.hasNext();) {
         String value = it.next();
          if (value.equals( "3")) {
              it.remove();  // ok
         }
    }
    System. out.println( "List Value:" + myList.toString());
     
     // 2 建一个集合,记录需要删除的元素,之后统一删除            
    List<string> templist = new ArrayList<string>();
     for (String value : myList) {
          if (value.equals( "3")) {
              templist.remove(value);
         }
    }
     // 可以查看removeAll源码,其中使用Iterator进行遍历
    myList.removeAll(templist);
    System. out.println( "List Value:" + myList.toString());       
     
      // 3. 使用线程安全CopyOnWriteArrayList进行删除操作
    List<string> myList = new CopyOnWriteArrayList<string>();
    myList.add( "1");
    myList.add( "2");
    myList.add( "3");
    myList.add( "4");
    myList.add( "5");
     
    Iterator<string> it = myList.iterator();
     
     while (it.hasNext()) {
         String value = it.next();
          if (value.equals( "3")) {
              myList.remove( "4");
              myList.add( "6");
              myList.add( "7");
         }
    }
    System. out.println( "List Value:" + myList.toString());
     
     // 4. 不使用Iterator进行遍历,需要注意的是自己保证索引正常
     for ( int i = 0; i < myList.size(); i++) {
         String value = myList.get(i);
         System. out.println( "List Value:" + value);
          if (value.equals( "3")) {
              myList.remove(value);  // ok
              i--; // 因为位置发生改变,所以必须修改i的位置
         }
    }
    System. out.println( "List Value:" + myList.toString());
  • 相关阅读:
    从一个表中查数据,插入另一个表
    sql 字段字符串内容替换
    安装VS2010后,如何设置老版本的项目文件不是默认用VS2010打开
    题解 [JOI 2019 Final] 独特的城市
    题解 [JOI 2019 Final] 硬币收藏
    题解 [CF720A] Closing ceremony
    [学习笔记] Miller-Rabin 质数测试
    题解 [CF332C] Students' Revenge
    题解 [CF525D] Arthur and Walls
    SpringMVC-拦截器
  • 原文地址:https://www.cnblogs.com/bluestorm/p/6347227.html
Copyright © 2011-2022 走看看