黑马程序员技术交流社区

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

作者: 盖保宁    时间: 2011-9-26 15:01
标题: 关于迭代的问题
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");会出错,但是为什么呢,求明白人解释
作者: 匿名    时间: 2011-9-26 15:13
但是竟然可以删除,太奇怪了
作者: 匿名    时间: 2011-9-26 15:24
虽然老师说迭代器只能做三个动作,添加做不了,但是al不是迭代器啊,语法没错误吧
作者: 匿名    时间: 2011-9-26 16:43
视频上说因为不可以并发咯,那么JAVA预制包肯定会包含一个保护开关,来核对是否是你自己用add修改了数组,还是由迭代器(remove)修改了,如果是自己用add或者其他方法修改那么肯定会被保护开关检测出来,抛出异常。其实也没啥好研究的,代码的特性,是人为干预的。
作者: 匿名    时间: 2011-9-26 19:12
这很简单,看看迭代器的源码就可以发现,每当执行到while(it.haxNext()){,java虚拟机会自动执行ArrayList类中的checkForComodification方法。[code=java]private void checkForComodification() {
        if (this.modCount != l.modCount)
            throw new ConcurrentModificationException();
    }[/code]而这个方法用来比较modCount和expectedModCount是否相等,但是你在循环遍历的时候添加了又添加了一个元素,改变集合的大小,导致modCount和expectedModCount不相等,自然会抛出ConcurrentModificationException(throw new ConcurrentModificationException();)




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