A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王怡然 黑马帝   /  2012-5-8 16:44  /  1898 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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");会出错,但是为什么呢,求明白人解释

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
        列表迭代器(List特有):
        listIterator();  返回此列表元素的列表迭代器。
        listIterator(index);  返回从指定位置开始列表中元素的列表迭代器。
        注:在操作时集合对象方法与迭代器不能同时操作元素,因为会发生异常,所以,在使用迭代器时只能使用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断、取出、删除的操作;如果想在迭代器时进行添加、修改等操作时就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
al.iterator();//已经把原数组的引用添加到迭代器里了
while(it.hasNext())
                {
                        Object obj = it.next();  //迭代器正在取出的过程中
                        if(obj.equals("java02"))
                            al.add("java004");   //又用到了集合的方法访问数组,产生了并发操作,这时就会报错,不能对同一组元素进行同时操作
                }
回复 使用道具 举报
因为在迭代的过程中又用到了集合的添加方法,迭代的过程中不能采用集合的方法对元素进行增删操作,否则就会产生并发修改异常。
迭代过程中可以通过迭代器提供的方法对元素进行操作。
回复 使用道具 举报
代码有两处是错的 "Object obj = it.next();"改"String s = it.next();"去掉 al.add("java004");不然会抛java.util.ConcurrentModificationException异常。原因是控制迭代器方法的是一个线程,调用非迭代器方法的是另一个线程,如果在迭代器迭代时出现了“al.add("java004");”就有这两个线程都对al集合进行操作,这样就会引起安全问题,所以系统不允许用多个线程在没有同步的情况下对al集合进行操作,抛出java.util.ConcurrentModificationException异常。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马