您的位置:首页 > 编程语言 > Java开发

java语言基础(66)——集合框架(arrayList ConcurrentModificationException 并发修改异常的解决方案)

2017-06-15 23:26 786 查看
问题重现:

package ArrayListDemo;

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo {

/**
* @param args
*/
public static void main(String[] args) {

ArrayList ls = new ArrayList();
ls.add("hello");
ls.add("world");
ls.add("java");

Iterator it = ls.iterator();
while(it.hasNext()){
String s = (String)it.next();
if(s.equals("world")){
ls.add("hello");
}
}

}

}
如上所述,在iterator遍历的ArrayList的同时,向集合中添加元素 hello ,会抛出并发修改异常ConcurrentModificationException,是因为迭代器 it  和  集合对象ls 同时操作 arrayList。

解决方案:

从字面意思我们可以猜到,既然是并发修改异常,肯定是发生了并发修改,那么我们可以避免并发修改,就可以避免异常了。

package ArrayListDemo;

import java.util.ArrayList;
import java.util.ListIterator;

public class ArrayListDemo {

/**
* @param args
*/
public static void main(String[] args) {

ArrayList ls = new ArrayList();
ls.add("hello");
ls.add("world");
ls.add("java");

//		Iterator it = ls.iterator();
//		while(it.hasNext()){
//			String s = (String)it.next();
//			if(s.equals("world")){
//				ls.add("hello");
//			}
//		}

// 解决方案1
// 迭代器遍历,迭代器修改
//		ListIterator lit = ls.listIterator();
//		while(lit.hasNext()){
//			String s = (String)lit.next();
//			if(s.equals("world")){
//				lit.add("hello");
//			}
//
//		}
//		System.out.println(ls.toString());
//[hello, world, hello, java] 添加成功

// 解决方案2
// 集合遍历,集合修改(普通for循环)
int len = ls.size();
for(int i = 0;i<len;i++){
if(ls.get(i).equals("world")){
ls.add("hello");
}
}
System.out.println(ls.toString());
// [hello, world, java, hello] 添加成功 但是元素在最后
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐