读书人

Enumeration对象再有元素执行hasMor

发布时间: 2013-07-01 12:33:04 作者: rapoo

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");
}
};
}

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


简单起见,只举删除一个的例子
原来你有10个元素,假设删除第9个
此时Enumeration的计数器=8(第9个),删除一个,vector长度变为9,
下一次hasMoreElements的时候,他用计数器和vector的当前长度比较,发现相同,自然返回false
[解决办法]
这本身是一个边遍历边删除的问题,楼主可以在这两行

Test tt = (Test)en.nextElement();
vector.remove(tt);
中插入
System.out.print(tt.i + " ");//结果是0 2 4 6 8

因为nextElement()方法是返回当前地址中的元素,并指向下一个元素的地址,当你调用vector.remove(tt);时这时就会造成Vector底层数组所存储的对象引用的向前移动,而en所指向的地址并未发生变化,这就会形成1,3,5,7,9这些元素没有被遍历到的现象

当你加上en = vector.elements();时就会造成en所指向的地址始终指向第一个元素所在的地址,
又由于remove所引起的移动,则会出现这样的现象
System.out.print(tt.i + " ");//结果是0 1 2 3 4 5 6 7 8 9

读书人网 >J2SE开发

热点推荐