List remove及ConcurrentModificationException异常
2024-09-01 06:55:52
参考: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();
最新文章
- 简单轮播js实现
- DataScientist————汇总篇
- C语言的基础
- JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址
- Js~对数组进行分组户数
- Java线程:线程栈模型与线程的变量
- MyBatis使用总结+整合Spring
- 笔记 (note)
- Latex 表格内公式换行方法
- WebGIS空间数据请求访问机制
- MySQL快速生产表的描述
- eclipse中clean操作中如何将validating除去
- 开发自己的cordova插件
- CLR via C# - 基础拾遗
- 聚类算法初探(四)K-means
- C#多线程,线程锁
- C# 编码规范、命名规则
- asp.net core 中的SignalR与web前端进行实时通信
- JS DOM节点
- Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类