Iterator 循环 List 使用remove方法报错的分析与解决办法。
来源:互联网 发布:淘宝男装店铺介绍范文 编辑:程序博客网 时间:2024/06/05 10:44
1、实例代码:Collection<String> coll = new ArrayList<String>();coll.add("123");coll.add("234");coll.add("456");for (Iterator<String> it = coll.iterator(); it.hasNext();) {String object = it.next();System.out.println(object);if ("123".equals(object)) {coll.remove(object);}}
初步看一下是否能找出代码存在的问题?
以上代码执行就会报异常:java.util.ConcurrentModificationException
通过异常进行分析:
in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
原因:
当集合使用Iterator进行迭代的时候,实际是new Itr()创建一个内部对象,初始化包含对象个数,可以理解为在独立线程中操作的。Iterator创建之后引用指向原来的集合对象。当原来的对象数量发生变化时,这个内部对象索引表内容其实是不会同步的。所以,当索引指针往后移动的时候就找不到要迭代的对象了。内部对象操作时为了避免这种情况都会通过checkForComodification方法检测是否一致,不一致提前抛出异常ConcurrentModifiedException。
解决办法:
Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。
- Iterator 循环 List 使用remove方法报错的分析与解决办法。
- Iterator 循环 List remove元素报错的解决办法
- List循环使用remove()方法
- Iterator的remove方法的使用
- 使用Iterator的remove方法删除元素
- Iterator之remove情况分析之一报错原因
- 如何使用for循环和iterator循环remove掉list中的数据
- 循环中使用List.remove的坑
- ArrayList删除元素(remove())报错的原理与解决办法
- Iterator迭代的过程中使用list.remove
- for循环删除(ArrayList.remove)报错及解决办法
- for循环删除(ArrayList.remove)报错及解决办法
- 在for循环中remove list报错越界的问题
- Struts:tags:iterator Struts循环list的几种方法
- ArrayList、Iterator的remove方法
- Java Iterator的remove方法
- 关于Iterator的remove()方法
- Java Iterator的remove()方法
- C#引用C++ Dll
- nodejs 国内镜像
- c# 基本值类型及其默认值
- iOS UIView 和 UIWindow 归类
- 关于ubuntu更新sudo apt-get update和sudo apt-get upgrade下载缓慢的问题
- Iterator 循环 List 使用remove方法报错的分析与解决办法。
- Jmeter 参数化几个方法
- oracle常用时间函数汇总
- vijos1034题解
- CLASSPATH的作用
- 完美解决 DXUT 之 error LNK2019
- CentOS开启FTP及配置用户
- Android GridView属性集合
- GAE技术大牛跳槽Snapchat