java - 迭代器和枚举的区别

标签 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);
        }
    }
}

上面的代码运行良好,输出为:

[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 通过制作底层数组的新副本来执行可变操作(添加、设置等)。因此,当您创建迭代器时,它是当时底层数组的反射(reflect)。

修复

    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
    }

关于java - 迭代器和枚举的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037855/

相关文章:

自定义模板类的 C++ 迭代器

java - 我在其主页上运行 JGibbLDA 演示时遇到错误

java - PlayFramework 和在 MySQL 数据库中搜索波斯语单词

java - 集合的偏移量和限制

javascript - 在 Javascript 中测试集合成员资格的运算符

c++ - 我如何使用 istream_iterator 将 unsigned char vector 转换为字符串?

c++ - 释放一对 vector 中对象的内存

java - Instant Time解析错误(无法从TemporalAccessor获取Instant)

java - 使用小数指数的 Math.pow

c# - 在非常大的集合 (10,000) 中更改值