黑马程序员技术交流社区

标题: 关于迭代问题 [打印本页]

作者: 王怡然    时间: 2012-5-8 16:44
标题: 关于迭代问题
ArrayList  al = new ArrayList();
                al.add("java01");
                al.add("java02");
                al.add("java03");
                al.add("java04");
                sop(al);
                Iterator it = al.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(obj.equals("java02"))
                            al.add("java004");
                }


虽然老师讲在迭代器里 al.add("java004");会出错,但是为什么呢,求明白人解释
作者: 周素强    时间: 2012-5-8 17:01
        列表迭代器(List特有):
        listIterator();  返回此列表元素的列表迭代器。
        listIterator(index);  返回从指定位置开始列表中元素的列表迭代器。
        注:在操作时集合对象方法与迭代器不能同时操作元素,因为会发生异常,所以,在使用迭代器时只能使用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断、取出、删除的操作;如果想在迭代器时进行添加、修改等操作时就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。
作者: 谭景宾    时间: 2012-5-8 17:04
al.iterator();//已经把原数组的引用添加到迭代器里了
while(it.hasNext())
                {
                        Object obj = it.next();  //迭代器正在取出的过程中
                        if(obj.equals("java02"))
                            al.add("java004");   //又用到了集合的方法访问数组,产生了并发操作,这时就会报错,不能对同一组元素进行同时操作
                }
作者: 张成龙    时间: 2012-5-8 17:08
因为在迭代的过程中又用到了集合的添加方法,迭代的过程中不能采用集合的方法对元素进行增删操作,否则就会产生并发修改异常。
迭代过程中可以通过迭代器提供的方法对元素进行操作。

作者: 永恒之翼网络    时间: 2012-5-8 17:25
代码有两处是错的 "Object obj = it.next();"改"String s = it.next();"去掉 al.add("java004");不然会抛java.util.ConcurrentModificationException异常。原因是控制迭代器方法的是一个线程,调用非迭代器方法的是另一个线程,如果在迭代器迭代时出现了“al.add("java004");”就有这两个线程都对al集合进行操作,这样就会引起安全问题,所以系统不允许用多个线程在没有同步的情况下对al集合进行操作,抛出java.util.ConcurrentModificationException异常。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2