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

273 阅读1分钟

思路

1.首先创建集合

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

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

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异常

通过定位错误的位置,可以知道是String str = (String) it.next();的错误。

可以通过查看iterator的源码得知是因为当前的数量和预期的数量不一致导致的错误

错误的原因:在使用iterator遍历集合时,我们又使用ArrayList对象向集合中添加元素造成的。

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

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的迭代器对象进行添加

这样问题就完美的解决了