[英]difference between iterator and 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);
}
}
}
上面的代码工作正常,输出为:
[1, 2]
12
first loop finished
3
现在看到下面的代码:
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
}
}
}
输出为:
[6, 2]
6
2
first loop finished
我正在学习java ..我怀疑在第一个示例中添加3后,我能够检索并打印它。但是在第二个示例中添加5后我无法检索并打印它。原因是什么? 是由于迭代器的失败安全行为吗? 还是枚举和迭代器之间的区别之一? 帮我....
CopyOnWriteArrayList
基于支持列表的基础数组的当前状态创建一个新的Iterator
。
Java源码
public ListIterator<E> iterator() {
return new COWIterator<E>(getArray(), 0);
}
该迭代器不包含在其创建后添加的元素,因为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
}
区别在于Iterator
具有.remove()
操作,而Enumeration
没有。
另外,我们在2014年,所以不要使用Vector
或Enumeration
; 它们已过时,仅旧式API仍在使用它们。
至于您的程序为何如此运行,这是由于CopyOnWriteArrayList
的“写入时复制”:迭代器是使用当前列表内容创建的; 如果在创建迭代器后修改该列表,则不会看到所做的修改。
问题是您使用了CopyOnWriteArrayList
类:
从CopyOnWriteArrayList的Java文档中获取:
“快照”样式的迭代器方法在创建迭代器时使用对数组状态的引用。 此数组在迭代器的生命周期内永不更改,因此不可能发生干扰,并且保证迭代器不会引发ConcurrentModificationException。 自创建迭代器以来,该迭代器将不会反映对列表的添加,删除或更改。 不支持对迭代器本身进行元素更改操作(删除,设置和添加)。 这些方法抛出UnsupportedOperationException
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.