使用ArrayList或Vector来检索枚举?

时间:2017-12-23 07:35:57

标签: java arraylist vector

查看返回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?

不同

所以我认为这不符合重复。

4 个答案:

答案 0 :(得分:1)

都不是。你不需要其中任何一个。 Collections.enumeration()引用Collection个参数,SetCollectionMap.keySet()返回Set

你只需要:

return Collections.enumeration(map.keySet());

答案 1 :(得分:0)

使用这些过时的 - 虽然不被弃用的课程通常是商业决策。关于它,您无能为力,除非可能,使用不同的API。

我不会使用Vector。如果您不需要在自己的代码中进行同步,请使用“集合框架”。如果确实需要同步,请使用同步,使用java.util.concurrent中的类。

无论哪种方式,使用Collections.enumeration将它们转换为枚举。

答案 2 :(得分:0)

根据您的使用情况,如果您不关心线程安全,请使用ArrayList,这样您就不会获得Vector的同步方法的额外开销, 否则使用Vector。

答案 3 :(得分:0)

我认为如果你想获得Enumeration就没有区别了。

Vector 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;
    }
}