繁体   English   中英

迭代器和枚举之间的区别

[英]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年,所以不要使用VectorEnumeration 它们已过时,仅旧式API仍在使用它们。

至于您的程序为何如此运行,这是由于CopyOnWriteArrayList的“写入时复制”:迭代器是使用当前列表内容创建的; 如果在创建迭代器后修改该列表,则不会看到所做的修改。

问题是您使用了CopyOnWriteArrayList类:

从CopyOnWriteArrayList的Java文档中获取:

“快照”样式的迭代器方法在创建迭代器时使用对数组状态的引用。 此数组在迭代器的生命周期内永不更改,因此不可能发生干扰,并且保证迭代器不会引发ConcurrentModificationException。 自创建迭代器以来,该迭代器将不会反映对列表的添加,删除或更改。 不支持对迭代器本身进行元素更改操作(删除,设置和添加)。 这些方法抛出UnsupportedOperationException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM