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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

List l=new ArrayList();
l.add("a");l.add("b"),l.add("c");
Iterator it=l.iterator();
while(it.hasNext())
     if(it.next().equals("b"))
           l.add("d");
}
it.next()返回“b”,同时it指向“c”,l在尾部添加“d”,it继续判断,貌似没什么问题?请教为什么会抛出异常?集合对象和迭代器同时操作,会出现什么错误情况?能否举例说明?

4 个回复

倒序浏览
迭代器与集合不能同时操作,否则会抛出ConcurrentModificationException这个异常,因为迭代器是通过集合来获取的,在迭代的途中改变集合的话,会不知道该如何运行,可以用ListIterator这个List特有的迭代器来完成同时操作的问题
回复 使用道具 举报
看了源代码,应该是这么解释:
集合对象内部有个变量,记录集合被修改的次数,迭代器内部也有记录集合被修改次数的变量,它的初值等于迭代器被创建时集合记录的修改次数,当调用it.Next()时,先判断内外部记录修改次数是否一致,如果不一致,迭代器认为有其他线程在修改集合,抛出异常
分析一下,这样可以避免这种情况出现:
假设it.hasNext()判断为true,进入循环体,指向最后一个元素,此时另一线程将集合中it指向的元素即最后一个元素删除了,回到迭代器线程,如果不判断,直接取值,找不到值了,程序异常。
不知道我理解的对不对,但是其他情况仍然不矛盾并发啊,为了一个Bug放弃所有操作,值得吗?
回复 使用道具 举报
同意楼上的。
回复 使用道具 举报
迭代器与集合不能同时操作,否则会抛出ConcurrentModificationException这个异常,因为迭代器是通过集合来获取的,在迭代的途中改变集合的话,会不知道该如何运行,可以用ListIterator这个List特有的迭代器来完成同时操作的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马