参考: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();

  

最新文章

  1. 简单轮播js实现
  2. DataScientist————汇总篇
  3. C语言的基础
  4. JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址
  5. Js~对数组进行分组户数
  6. Java线程:线程栈模型与线程的变量
  7. MyBatis使用总结+整合Spring
  8. 笔记 (note)
  9. Latex 表格内公式换行方法
  10. WebGIS空间数据请求访问机制
  11. MySQL快速生产表的描述
  12. eclipse中clean操作中如何将validating除去
  13. 开发自己的cordova插件
  14. CLR via C# - 基础拾遗
  15. 聚类算法初探(四)K-means
  16. C#多线程,线程锁
  17. C# 编码规范、命名规则
  18. asp.net core 中的SignalR与web前端进行实时通信
  19. JS DOM节点
  20. Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类

热门文章

  1. Vue2.0+Webpack项目环境构建到发布
  2. RVM(ruby version manage)安装指南
  3. visual studio 2013 触发挂起事件
  4. jquery 对table的一些操作 怎么获取tr下的第二个td元素?
  5. cocos2dx3.2升级Android5的坑
  6. java ssm框架入门(三)正式项目的web.xml配置
  7. ExecuteNonQuery和ExecuteScalar的区别
  8. [内核]Linux UserSpace和Kernel之间如何联系
  9. per-cpu
  10. 获取checkbox 组成字符串