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() 方法是个安全的做法。



0 0
原创粉丝点击