2012-11-28 50 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

相關問題