JDK是这么说的:
在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间任意发生不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。
那么
迭代器Iterator如何知道是否是自身进行结构上的修改?是因为这些集合内部有一个modCount参数,每一次的remove或add都会使modCount累加,而对应的迭代器内部则有一个expectedModCount参数,在创建Iterator时将modeCount传给expectedModCount,之后通过这两个参数的比较,可以判断集合是否可以更改。
我们知道Collection遍历有两种方法,一种是采用跟数组遍历类似的方法,如下:
//1.
List<String> strs = new List<String>(Collections.nCopies(10,"String"));
for(int i = 0; i < strs.size();i++) {
System.out.println(strs.get(i));
if(i %2 == 0) {
//strs.remove(i);
}
}
第二种就是使用迭代器:
//2.
List<String> strs = new ArrayList<String>(Collections.nCopies(10,"String"));
Iterator iter = strs.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
//iter.remove();
}
这两个遍历方法如果在遍历时没有从结构上对映射进行修改,是没有什么差别与问题。但是一旦在遍历的时候想要插入或删除元素时,需要注意一些问题:
方法1中,每次循环时,size()会改变,如果只需要原始的长度,则可以采用如下方法解决:
List<String> strs = new List<String>(Collections.nCopies(10,"String"));
int length = strs.size();
for(int i = 0; i < length;i++) {
System.out.println(strs.get(i));
if(i %2 == 0) {
strs.remove(i);
}
}
方法2中,每次循环时,你如果想要改变结构,需要注意的是:
不能调用集合的add或remove方法,需要使用iterator的add或remove方法。
分享到:
相关推荐
是关于iterator的函数,以及它们的作用!
struts2 中标签的使用 这段时间学习用struts2来开发网站,其中对一些struts2的标签在实际操作上有一些体会。 一.关于iterator迭代集合对象的问题:
一个运用Extjs,Struts2, json,iterator技术构建的iterator_jsonDemo2。iterator_jsonDemo1的链接:http://download.csdn.net/detail/cafebar123/8816409 运用了Extjs,Struts2, json,iterator技术, 将数据从...
Boost Iterator_adaptor
该文档是演示迭代器Iterator的使用方法和源代码,其中包括了Iterator的继承类的讲解和再Iterator中的两种方法
本资源模拟java ArrayList Iterator的实现方式,其实也是为了介绍一下Iterator的设计模式。
图解设计Iterator 源代码
java-util-iterator.pdfjava-util-iterator.pdfjava-util-iterator.pdf
逆序reverse_iterator打印 /* 编写一段程序,用普通迭代器顺序打印一个vector,再用逆序reverse_iterator打印一个它 */
java中Iterator迭代器讲解,基础数据对象。
Java源码分析:深入探讨Iterator模式
一个iterator_jsonDemo. 1.通过iterable接口和iterator实现迭代输出。2.通过JSONArray实现输出(自带json相关jar包)。供参考。
介绍C++中Iterator的用法,很实用
C++使用iterator的例子
struts2中iterator 标签的使用详解
struts2 标签iterator使用我自己试过的
vector容器与iterator迭代器,有两者的区别和联系,供大家学习理解
JAVA中的Iterator的用法 详细讲解用法
Collection、Map、List、Set、Iterator
迭代器模式(Iterator)C++实现