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

来源:互联网 发布:淘宝网店转让合法吗 编辑:程序博客网 时间:2024/06/06 09:16

问题重现:

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] 添加成功 但是元素在最后}}



阅读全文
0 0
原创粉丝点击