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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄丽慧 于 2012-7-9 10:42 编辑

前几天在写代码的时候利用迭代器遍历ArrayList容器,删除符合条件的元素时出现了问题
public class demo
{
public static void main(String[] agrs)
{
ArrayList al=new ArrayList();
Iterator i=al.iterator();
while(i.hasNext())
{
  if(i.next()=="abc")
  al.remove("abc");
}
}
}
编译时,eclipse就会报错,但是当把al.remove改成i.remove就可以了,这是为什么呢

2 个回复

倒序浏览
并发修改异常,我在回答别人的类似的问题里贴过.
ArrayList继承于AbstractList类
这个类中有一个内部类叫Itr,作用是返回一个Iterator接口的实例,在这个内部类中,包含一个 modCount(modify count 修改次数)变量,它的初始值是0,当集合每被修改一次时(调用add,remove等方法),modCount加1。因此,modCount如果不 变,表示集合内容未被修改。
另外,还有一个叫expectedModCount(expected modify count 预期修改次数)的变量
Itr初始化时用expectedModCount记录集合的modCount变量,此后它会检测modCount的值
如果modCount与一开始记录在expectedModeCount中的值不等,说明集合内容被修改过,此时会抛出ConcurrentModificationException。
你这个程序姑且不说还有别的一些细小的问题,就单独拿你说的这个问题,你在用i进行迭代遍历的时候,试图通过al修改List,那么按照上面解释的源代码,expectedModCount没有发生改变,而modCount变了,自然就抛出异常了
然后你改为Iterator对象本身的remove操作,这个操作在删除对象的同时,不但修改了modCount的值,还修改了expectedModCount的值,因此就不会抛出异常

如果你还想知道我说的小问题,我觉得可能是你代码没贴全的缘故
1. 你的这段代码,不论是al,还是i,都抛出并发修改异常,因为你的list的是空的,modCount,expectedModCount 这两个值无论如何都没法改变
2. 不加泛型的集合不是好集合,不安全

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 说的很详细,但是繁琐了!

查看全部评分

回复 使用道具 举报
{:soso_e103:}出现这种情况,你要先想清楚,移除元素是从哪儿移除,迭代器又是做什么的?
移除元素是从集合中移除,也就是只有集合才有remove()方法,而迭代器仅仅是便利元素的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马