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();
作者: lost blog
出处: http://www.cnblogs.com/JAYIT/
关于作者:专注服务器端开发
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接 如有问题, 可邮件(sawyershaw@qq.com)咨询.

浙公网安备 33010602011771号