Iterator for Java Framework集合的不同结果
我对迭代器在主要Java框架集合类(不仅仅是List类)上的不同行为有一些疑问Iterator for Java Framework集合的不同结果,java,collections,foreach,iterator,Java,Collections,Foreach,Iterator,我对迭代器在主要Java框架集合类(不仅仅是List类)上的不同行为有一些疑问 名单 如果我为每个人都写,我会有一个例外: Collection<String> cc= new ArrayList<>(3); cc.add("Cio"); cc.add("Mio"); cc.add("Tio"); for (String s:cc) { System.out.println(s); cc.remove(s);
Collection<String> cc= new ArrayList<>(3);
cc.add("Cio");
cc.add("Mio");
cc.add("Tio");
for (String s:cc) {
System.out.println(s);
cc.remove(s); //Exception
}
for (Iterator<String> it =cc.iterator(); it.hasNext();) {
String s =it.next();
if (s.startsWith("C"))
it.remove();
}
ArrayDeque<String> greetings = new ArrayDeque<String>();
greetings.push("hello");
greetings.push("hi");
greetings.push("ola");
greetings.pop();
greetings.peek();
while (greetings.peek() != null)
System.out.print(greetings.pop());
Iterator<String> it = greetings.iterator();
while(it.hasNext()) {
System.out.println(greetings.pop()); //Exception
}
Collection cc=newarraylist(3);
抄送添加(“Cio”);
抄送添加(“Mio”);
cc.添加(“Tio”);
for(字符串s:cc){
系统输出打印项次;
cc.remove(s);//异常
}
如果使用迭代器,则不会出现异常:
Collection<String> cc= new ArrayList<>(3);
cc.add("Cio");
cc.add("Mio");
cc.add("Tio");
for (String s:cc) {
System.out.println(s);
cc.remove(s); //Exception
}
for (Iterator<String> it =cc.iterator(); it.hasNext();) {
String s =it.next();
if (s.startsWith("C"))
it.remove();
}
ArrayDeque<String> greetings = new ArrayDeque<String>();
greetings.push("hello");
greetings.push("hi");
greetings.push("ola");
greetings.pop();
greetings.peek();
while (greetings.peek() != null)
System.out.print(greetings.pop());
Iterator<String> it = greetings.iterator();
while(it.hasNext()) {
System.out.println(greetings.pop()); //Exception
}
for(Iterator it=cc.Iterator();it.hasNext();){
字符串s=it.next();
如果(s.startsWith(“C”))
it.remove();
}
Collection<String> cc= new ArrayList<>(3);
cc.add("Cio");
cc.add("Mio");
cc.add("Tio");
for (String s:cc) {
System.out.println(s);
cc.remove(s); //Exception
}
for (Iterator<String> it =cc.iterator(); it.hasNext();) {
String s =it.next();
if (s.startsWith("C"))
it.remove();
}
ArrayDeque<String> greetings = new ArrayDeque<String>();
greetings.push("hello");
greetings.push("hi");
greetings.push("ola");
greetings.pop();
greetings.peek();
while (greetings.peek() != null)
System.out.print(greetings.pop());
Iterator<String> it = greetings.iterator();
while(it.hasNext()) {
System.out.println(greetings.pop()); //Exception
}
ArrayDeque问候语=new ArrayDeque();
问候。推(“你好”);
问候。推(“嗨”);
问候。推(“ola”);
您好。pop();
你好。peek();
while(问候语.peek()!=null)
System.out.print(greetings.pop());
但是如果我使用迭代器,我会有一个例外:
Collection<String> cc= new ArrayList<>(3);
cc.add("Cio");
cc.add("Mio");
cc.add("Tio");
for (String s:cc) {
System.out.println(s);
cc.remove(s); //Exception
}
for (Iterator<String> it =cc.iterator(); it.hasNext();) {
String s =it.next();
if (s.startsWith("C"))
it.remove();
}
ArrayDeque<String> greetings = new ArrayDeque<String>();
greetings.push("hello");
greetings.push("hi");
greetings.push("ola");
greetings.pop();
greetings.peek();
while (greetings.peek() != null)
System.out.print(greetings.pop());
Iterator<String> it = greetings.iterator();
while(it.hasNext()) {
System.out.println(greetings.pop()); //Exception
}
Iterator it=greetings.Iterator();
while(it.hasNext()){
System.out.println(greetings.pop());//异常
}
为什么??迭代器是否会为其他JFC集合抛出异常,特别是:HashSet、TreeSet、LinkedList
非常感谢
A.阵列列表 列表维护一个
modCount
字段,该字段在每次对列表进行结构修改时递增
结构修改是指改变列表大小的修改,
或者以某种方式干扰它,使迭代进行中
可能会产生错误的结果
进一步
如果此字段的值意外更改,则迭代器(或列表
迭代器)将抛出ConcurrentModificationException以响应
下一步、删除、上一步、设置或添加操作。这就提供了
快速失效行为,而不是表面上的非确定性行为
迭代过程中并发修改的实例。通过
子类是可选的
如果子类希望提供fail fast迭代器(和list
迭代器),则只需在其add(int)中增加此字段,
E) 和删除(int)方法(以及它覆盖的任何其他方法)
这将导致对列表进行结构修改
列表迭代代码的两种形式:
一,
及
二,
--它的工作方式与其对应的ArrayList
完全相同
调用ArrayQue类的pop()
或push()
方法时,实际上并不在队列上进行迭代,只需修改队列的头部或尾部。这就像在不进行迭代时调用ArrayList类的remove()方法(而不是ArrayList的迭代器的remove())。这不符合结构修改的条件。因此不会引发异常
请参阅文章。Iterator不反映基础列表中的更改。可能存在@ghoul932的重复,但仅适用于列表?为什么在ArrayDeque中它(Iterator)会引发异常?在您的链接中,参数仅适用于列表。我想知道其他JFC集合的行为。您没有使用
it.next()
。有些集合提供了一致性。请查看包java.util.concurrent
。