查看返回Enumeration<?>
的两个不同实现
Vector<String> v = new Vector<>(map.keySet());
return v.elements();
List<String> v = new ArrayList<>(map.keySet());
return Collections.enumeration(v);
请注意,这里返回类型Enumeration<?>
,无法更改。
使用一个优于另一个是否有任何优势?
由于枚举类是同步的,我应该更好地坚持使用Vector
吗?
我的目的不是比较Vector和ArrayList,而是从上面两个特定的代码用法中找到更好的实现。这里的答案也与What are the differences between ArrayList and Vector?不同
所以我认为这不符合重复。
都不是。你不需要其中任何一个。 Collections.enumeration()
采取Collection
论证,Set
是Collection
,Map.keySet()
返回Set
。
您只需要:
return Collections.enumeration(map.keySet());
使用这些过时的 - 虽然不被弃用的类通常是商业决策。除此之外,您可以做的事情不多,但如果可能的话,请使用不同的API。
我不会使用Vector
。如果您不需要在自己的代码中进行同步,请使用“集合框架”。如果确实需要同步,请使用同步,使用java.util.concurrent
中的类。
无论哪种方式,使用Collections.enumeration
将它们转换为枚举。
根据您的使用情况,如果您不关心线程安全,请使用ArrayList,这样您就不会获得Vector的同步方法的额外开销,否则请使用Vector。
我想如果你想获得Enumeration,那就没有区别了。
矢量constoructor如下。
public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
ArrayList构造函数如下。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}