日期:2014-05-20  浏览次数:20787 次

Enumeration对象还有元素,执行hasMoreElements返回false,内有测试源码

import java.util.Enumeration;
import java.util.Vector;


public class Test {

private int i = 0;
private boolean isBusy;

public Test(int i, boolean isBusy) {
this.i = i;
this.isBusy = isBusy;
}

public static void main(String[] args) {
Vector vector = new Vector();
for (int i = 0; i < 10; i++) {
vector.addElement(new Test(i, false));
System.out.println("add");
}
Enumeration en = vector.elements();
while (en.hasMoreElements()) {
Test tt = (Test)en.nextElement();
vector.remove(tt);
System.out.println("remove");
// en = vector.elements();
}
}

}



打开注释正常执行10次,关闭却只能执行5次,但是明明en里面还有5个对象,为什么此时执行hasMoreElements()判断却为false,十分不解。

------解决方案--------------------
不清楚。感觉上en只是单纯的保存了vector随机访问时的下标i:
1.hasMoreElements()是在比较en中保存的i与vector.size()
2.nextElement()调用了vector.elementAt(i++)
不知道上面的猜测对不对~~~
建议楼主改用ArrayList和Iterator。用Iterator接口的remove方法来删除元素,这样就不会出错了。
------解决方案--------------------
额,elements()的源码:
    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");
            }
        };
    }

------解决方案--------------------