我是靠谱客的博主 简单大神,这篇文章主要介绍Iterator 循环 List 使用remove方法报错的分析与解决办法。,现在分享给大家,希望可以做个参考。

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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(124)

评论列表共有 0 条评论

立即
投稿
返回
顶部