2012-11-28 52 views
3

我已经写Java代码:在java中使用Vector是否安全?

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

谢谢。

+0

从这个答案似乎是这样 - http://stackoverflow.com/questions/3343212/arraylist-in-j2me – SSR

+1

您是否搜索网络上的错误消息? –

+0

是J2ME中可用的TreeMap吗?我认为这不是。 – Bakhtiyor

回答

8

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

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

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

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

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

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

+0

如果你删除了这个不正确的信息,你会得到满意的结果吗?''因为Vector已经被弃用而不喜欢List',所以有'过时类型'警告。 – Perception

+0

@Perception:我已经将它改为“(本质上)不推荐使用”,因为在JavaME之外它已*基本上(但并未正式)弃用。在JavaME或遗留系统以外的任何其他应用中使用'Vector'会在代码审查时引起注意。 Netbeans正在发布有关这一惯例的警告,因此至少Netbeans人同意我的观点:) –

+0

我绝对同意,它的一个小小的诡辩,以免OP实际上相信Vector已被正式弃用。大概7年后,我自己也没有用过这门课。 +1。 – Perception

0

不安全的警告与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); 
} 

按蚊蚋的评论,上面的代码不会在J2ME中,这是1.3的一个子集工作。显然,即使ArrayList不受支持。因此,问题示例中的原始代码看起来像是要走的路。

+0

您的假设出现错误Java ME使用Java 1.3的一个子集(不是错字:**一个点三**) – gnat

+0

哇,我知道它落后了,但我不知道它远远落后。我会纠正这个例子。 – Bill

相关问题