有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的枚举是故障安全的吗?如果是,怎么做?

java中有故障安全迭代器,它创建集合的副本进行迭代,以提供故障安全行为

枚举用于遗留java类Vector、Stack和HashTable等(这些是同步的集合)

java中的枚举如何是故障安全的,它如何提供故障安全行为? 它是否也会为迭代创建集合的副本


共 (1) 个答案

  1. # 1 楼答案

    我不会叫Enumeration故障保险

    至少不是由Vectorelements()方法返回的实现:

    public Enumeration<E> elements() {
        return new Enumeration<E>() {
            int count = 0;
    
            public boolean hasMoreElements() {
                return count < elementCount;
            }
    
            public E nextElement() {
                synchronized (Vector.this) {
                    if (count < elementCount) {
                        return elementData(count++);
                    }
                }
                throw new NoSuchElementException("Vector Enumeration");
            }
        };
    }
    

    如果在对Vector进行迭代时修改Vector,此实现可能会导致错误行为,而不会引发异常

    例如,下面的代码将导致一个无限循环,其中对els.nextElement ()的每个调用都将返回相同的元素"a"

    Vector<String> vec = new Vector<> ();
    vec.add ("a");
    vec.add ("b");
    vec.add ("c");
    Enumeration<String> els = vec.elements ();
    while (els.hasMoreElements ()) {
        System.out.println (els.nextElement ());
        vec.add (0,"d");
    }