collection中使用增强for循环时删除出错的分析
2015-06-24 11:28
344 查看
在对集合使用增强for循环时会发现在for循环中对集合的删除动作会抛出异常
以list为例,因为增强for循环实际上是将根据list对象来创建一个iterator迭代对象,有着额迭代对象来遍历list,等于是list的元素全部由iterator来操作,对任何list元素的操作都是由iterator来完成的。而对iterator的操作有两个方法来决定
modCount表示list对象生成后对他的修改次数,当list的remove和add方法执行时,modCount自增
expectedModCount表示Iterator现在期望list被修改的次数
iterator建立时modCount被赋值给了expectedModCount,expectedModCount是不会改变的,而modCount随着add/remove发生改变,于是抛出
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循环遍历时可以删除元素
相关文章推荐
- “百度与站长”更新:关于网站收录,删除,seo等
- 用vbs删除某些类型文件和磁盘空间报告的脚本
- QQ聊天记录删除了怎么恢复简单方法
- vbs删除注册表项的代码
- 迅速删除非法文件名的批处理代码
- 通过批处理实现删除运行、查找等处的历史记录的代码
- Shell中删除某些文件外所有文件的3个方法
- 删除文件提示文件正在被另一个人或程序使用的解决方法
- 关于.LDB文件 .ldb文件的产生 .ldb文件的删除方法
- asp 合并记录集并删除的sql语句
- SQLserver 数据库危险存储过程删除与恢复方法
- sql自增长设置与删除的深入分析
- 使用 Iisext.vbs 删除 Web 服务扩展文件的方法
- linux oracle数据库删除操作指南
- jQuery删除一个元素后淡出效果展示删除过程的方法
- 使用 Iisftpdr.vbs 删除FTP虚拟目录(支持本地与远程)
- 必须会的SQL语句(四) 数据删除和更新
- mssql SA帐号的改名和删除
- UTF-8 编码中BOM的检测与删除
- VC实现批量删除指定文件的方法