【问题标题】:Is it safe to use Vector in java?在java中使用Vector安全吗?
【发布时间】:2012-11-28 05:14:52
【问题描述】:

我写了以下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&lt;String&gt; vector = new Vector&lt;String&gt;();。现在收到另一条警告消息:

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;
                                                 ^

谢谢。

【问题讨论】:

标签: java java-me vector


【解决方案1】:

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

出现“过时类型”警告是因为 Vector 已(基本上)被弃用,取而代之的是 List 及其实现(ArrayListLinkedList 等)。

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

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

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

如果您愿意,您可以忽略这些警告。他们会告诉您,如果您不小心,可能会出现问题,但如果您小心,那么您会没事的。

【讨论】:

  • 如果您删除此不正确的信息,将投票赞成 - The "obsolete type" warning is there because Vector has been deprecated in favor of List
  • @Perception:我已将其更改为“(基本上)弃用”,因为在 JavaME 之外它基本上(但未正式)弃用。在 JavaME 或遗留系统以外的任何地方使用 Vector 会在代码审查时引起人们的注意。 Netbeans 对这个约定发出了警告,所以至少 Netbeans 的人同意我的观点:)
  • 我完全同意,这是一个小问题,以免 OP 实际上认为 Vector 已被正式弃用。我自己可能有 7 年没用过这门课了。 +1。
  • @Perception:好的,好电话。我可以看到这是如何推断出来的。
【解决方案2】:

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

枚举接口也已过时。您应该更喜欢迭代器。事实上,有一些语言特性可以利用它们。例如“新” for 循环。

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

例如(不适用于 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 的 cmets,上面的代码在 J2ME 中不起作用,J2ME 是 1.3 的子集。显然,甚至不支持 ArrayList。所以问题示例中的原始代码看起来像是要走的路。

【讨论】:

  • 您的假设似乎错误 Java ME 使用 Java 1.3 的一个子集(不是错字:一个点三
  • 哇,我知道它落后了,但我不知道它落后那么远。我会更正这个例子。
猜你喜欢
  • 2012-02-20
  • 2017-02-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多