您的位置:首页 > 其它

collection中使用增强for循环时删除出错的分析

2015-06-24 11:28 344 查看
在对集合使用增强for循环时会发现在for循环中对集合的删除动作会抛出异常

java.util.ConcurrentModificationException
为什么会出现这种情况?
以list为例,因为增强for循环实际上是将根据list对象来创建一个iterator迭代对象,有着额迭代对象来遍历list,等于是list的元素全部由iterator来操作,对任何list元素的操作都是由iterator来完成的。而对iterator的操作有两个方法来决定
hasNext()   //判断是否由下一个元素
next()      //取下一个元素
hasNext():
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
其中
modCount表示list对象生成后对他的修改次数,当list的remove和add方法执行时,modCount自增

expectedModCount表示Iterator现在期望list被修改的次数
iterator建立时modCount被赋值给了expectedModCount,expectedModCount是不会改变的,而modCount随着add/remove发生改变,于是抛出
new ConcurrentModificationException()
(当然以上的思路都是建立在list没有被多线程共享的情况下) 参考--http://rongmayisheng.com/post/破除迷信java-util-arraylist在foreach循环遍历时可以删除元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息