java中有失败的安全迭代器,它创建集合的副本以迭代以提供失败安全行为。
枚举适用于遗留的java类Vector,Stack和HashTable等(这些是同步集合)。
java中的枚举如何安全失败,它如何提供故障安全行为? 它是否也为迭代创建了集合的副本?
答案 0 :(得分:0)
我不会致电Enumeration
故障安全。
至少不是Vector
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");
}
};
}
如果在迭代时修改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");
}