• List remove及ConcurrentModificationException异常


    参考:http://blog.csdn.net/androidboy365/article/details/50540202/

    解决方案

    // 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 = newArrayList<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 = newCopyOnWriteArrayList<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(inti = 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());
    

      

    单线程情况下列出4种解决方案,但是在多线程情况下仅有第4种方案才能在多线程情况下不出现问题。

    List<string> myList = newCopyOnWriteArrayList<string>();
    
     myList.add("1");
    
     myList.add("2");
    
     myList.add("3");
    
     myList.add("4");
    
     myList.add("5");
    
     
    
    newThread(newRunnable() {
    
       
    
         @Override
    
         publicvoidrun() {
    
              for(String string : myList) {
    
                   System.out.println("遍历集合 value = "  + string);
    
                 
    
                   try{
    
                        Thread.sleep(100);
    
                   }catch(InterruptedException e) {
    
                        e.printStackTrace();
    
                   }
    
              }
    
         }
    
    }).start();
    
     
    
    newThread(newRunnable() {
    
       
    
         @Override
    
         publicvoidrun() {
    
            
    
              for(inti = 0; i < myList.size(); i++) {
    
                   String value = myList.get(i);
    
                 
    
                   System.out.println("删除元素 value = "  + value);
    
             
    
               if(value.equals("3")) {
    
                    myList.remove(value);
    
                    i--;// 注意                          
    
               }
    
             
    
               try{
    
                        Thread.sleep(100);
    
                   }catch(InterruptedException e) {
    
                        e.printStackTrace();
    
                   }
    
              }
    
         }
    
    }).start();
    

      

  • 相关阅读:
    Best Practices for Using Alpha
    Android手机 Fildder真机抓包
    Android调用MediaScanner进行新产生的媒体文件扫描
    读书笔记-----Java并发编程实战(二)对象的共享
    项目经验谈---IM新消息界面刷新异常处理记录
    读书笔记-----Java并发编程实战(一)线程安全性
    OnScroll与OnTouchEvent方法的区别与联系
    View的getLeft, getRight, getTop, getBottom
    如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN
    更改ubuntu mysql data目录位置
  • 原文地址:https://www.cnblogs.com/JAYIT/p/8252457.html
Copyright © 2020-2023  润新知