在java中使用Vector是否安全?

时间:2012-11-28 05:14:53

标签: java java-me vector

我写了以下java代码:

public static void main(String[] args) {
    Vector vector = new Vector();
    for(int i=1; i<=10; i++)
        vector.addElement(i);

    Enumeration vEnum = vector.elements();
    while(vEnum.hasMoreElements())
        System.out.println(vEnum.nextElement());
}

编译时会收到以下警告信息:

Note: TestJavaApplication.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Netbeans抱怨“过时收藏”的消息。

在这种情况下,你推荐我什么?

注意,我需要在J2ME应用程序中使用Vector作为存储元素顺序的动态数组。我很乐意使用Hashtable,但不幸的是它不存储其元素的顺序。

编辑1 在审核this answer后,我将声明从Vector vector = new Vector();更改为Vector<String> vector = new Vector<String>();。现在又收到另一条警告信息:

TestJavaApplication.java:2: warning: com.sun.org.apache.xerces.internal.parsers.IntegratedParserConfiguration is Sun proprietary API and may be removed in a future release
import com.sun.org.apache.xerces.internal.parsers.IntegratedParserConfiguration;
                                                 ^

谢谢。

2 个答案:

答案 0 :(得分:9)

您看到的关于“未经检查或不安全的操作”的警告是因为Vector是参数化类型。它实际上是Vector<E>,您应该在使用Vector时提供类型参数。如果您使用“原始”Vector,那么您将无法获得Java的泛型框架的任何优势。 “不安全”警告意味着您错过了某种类型的安全性。

存在“过时类型”警告,因为Vector已被(基本上)弃用,以支持List及其实现(ArrayListLinkedList等)

各种List类型是Vector的通用替代品。 ArrayList可以用作Vector的或多或少的替代品,但您应该注意一些差异。阅读javadocs以获取更多信息。

最重要的区别是Vector是线程安全的,但ArrayListLinkedList不是。如果您依赖于Vector的内置线程安全性,那么您应该查看Collections.synchronizedList方法。

编辑:哦,你正在使用JavaME。在这种情况下,您可能会遇到Vector。尽管如此,通用类型警告仍然适用。

如果您愿意,可以忽略警告。他们在那里告诉你,如果你不小心可能有问题,但如果你 小心那么你会没事的。

答案 1 :(得分:0)

不安全的警告与Vector无关。只是代码没有指定Vector应包含的内容。通常,您希望使用ArrayLists而不是Vectors,并且您可能还想指定容器中的类型。

Enumeration接口也已过期。你应该更喜欢迭代器。事实上,有一些语言功能可以利用它们。例如循环的“新”。

注意:我假设J2ME支持这些功能。如果没有,那么“旧方式”就没有错。他们只是不是最佳的。

e.g。 (不适用于J2ME,但适用于Java 5或更高版本)

public static void main(String[] args) {
    ArrayList<Integer> vector = new ArrayList<Integer>();
    for(int i=1; i<=10; i++)
        vector.addElement(i);

    for(Integer i : vector)
        System.out.println(i);
}

根据gnat的评论,上述代码在J2ME中不起作用,J2ME是1.3的子集。显然,甚至不支持ArrayList。所以问题示例中的原始代码看起来就像是要走的路。