使用迭代器遍历集合出现ConcurrentModificationException的总结

思路

1.首先建立集合java

2.使用集合对象添加元素sql

3.建立Iterator对象,并进行循环遍历bash

public class Test {
    public static void main(String[] args) {
        //建立集合对象
        ArrayList<String> al = new ArrayList<String>();
        //添加元素
        al.add("hello");
        al.add("world");
        al.add("java");
        //建立Iterator对象
        Iterator it = al.iterator();
        while(it.hasNext()){    //判断集合中是否会有下一个元素
            String str = (String) it.next();
            //在此添加一个添加,若是输出到了"world"就再为集合添加"sql"元素
            if("world".equals(str)){
                al.add("sql");
            }
        }
        System.out.println(al);
    }
}
复制代码

这时你会发现程序会出现ConcurrentModificationException异常spa

经过定位错误的位置,能够知道是String str = (String) it.next();的错误。

能够经过查看iterator的源码得知是由于当前的数量和预期的数量不一致致使的错误

错误的缘由:在使用iterator遍历集合时,咱们又使用ArrayList对象向集合中添加元素形成的。code

解决方式:经过使用ListIterator接口的迭代器解决cdn

public class Test {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("hello");
        al.add("world");
        al.add("java");
        //ListIterator是Iterator的扩展
        ListIterator<String> li = al.listIterator();
        while(li.hasNext()){
            String str = li.next();
            if("world".equals(str)){
                li.add("sql");
            }
        }
        System.out.println(al);
    }
}
复制代码

这里须要注意add()方法要使用ListIterator的迭代器对象进行添加对象

这样问题就完美的解决了blog

相关文章
相关标签/搜索