raj*_*i.. 1 java collections iterator enumeration
看下面的代码
import java.util.Enumeration;
import java.util.Vector;
public class Modification_On_Eumeration {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<Integer>();
vector.add(1);
vector.add(2);
System.out.println(vector);
Enumeration<Integer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
Integer integer = (Integer) enumeration.nextElement();
System.out.print(integer);
}
System.out.println();
System.out.println("first loop finished");
vector.add(3);
while (enumeration.hasMoreElements()) {
Integer integer1 = (Integer) enumeration.nextElement();
System.out.println(integer1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,输出是:
[1, 2]
12
first loop finished
3
Run Code Online (Sandbox Code Playgroud)
现在看下面的代码:
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class Fail_Safe_Iterator {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> copyOnWriteArrayList=new CopyOnWriteArrayList<Integer>();
copyOnWriteArrayList.add(6);
copyOnWriteArrayList.add(2);
System.out.println(copyOnWriteArrayList);
Iterator<Integer> iterator=copyOnWriteArrayList.iterator();
while (iterator.hasNext()) {
Integer integer = (Integer) iterator.next();
System.out.println(integer);
}
System.out.println("first loop finished");
copyOnWriteArrayList.add(5);
while (iterator.hasNext()) {
Integer integer = (Integer) iterator.next();
System.out.println(integer);//why not printing 5
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
[6, 2]
6
2
first loop finished
Run Code Online (Sandbox Code Playgroud)
我正在学习java ..我怀疑是在添加3之后的第一个例子中,我能够回溯并打印它.但是在第二个例子中,在添加5之后我无法回溯并打印它.原因是什么?是因为迭代器失败安全行为?或者它是枚举和迭代器之间的区别之一?帮我....
根据支持列表的底层数组的当前状态CopyOnWriteArrayList
创建一个新Iterator
的.
Java来源
public ListIterator<E> iterator() {
return new COWIterator<E>(getArray(), 0);
}
Run Code Online (Sandbox Code Playgroud)
此迭代器不包含创建后添加的元素,因为它通过创建CopyOnWriteArrayList
基础数组的新副本来执行变异操作(添加,设置等).因此,在创建迭代器时,它会在该瞬间反射基础数组.
固定
System.out.println("first loop finished");
copyOnWriteArrayList.add(5);
//get the new iterator after adding
iterator = copyOnWriteArrayList.iterator();
while (iterator.hasNext()) {
Integer integer = (Integer) iterator.next();
System.out.println(integer);//why not printing 5
}
Run Code Online (Sandbox Code Playgroud)