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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盖保宁 黑马帝   /  2011-9-26 15:01  /  1993 人查看  /  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 收起 理由
wangfayin + 1

查看全部评分

4 个回复

正序浏览
黑马网友  发表于 2011-9-26 19:12:46
报纸
这很简单,看看迭代器的源码就可以发现,每当执行到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();)

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-26 16:43:51
板凳
视频上说因为不可以并发咯,那么JAVA预制包肯定会包含一个保护开关,来核对是否是你自己用add修改了数组,还是由迭代器(remove)修改了,如果是自己用add或者其他方法修改那么肯定会被保护开关检测出来,抛出异常。其实也没啥好研究的,代码的特性,是人为干预的。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-26 15:24:34
藤椅
虽然老师说迭代器只能做三个动作,添加做不了,但是al不是迭代器啊,语法没错误吧
回复 使用道具 举报
黑马网友  发表于 2011-9-26 15:13:50
沙发
但是竟然可以删除,太奇怪了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马