2011-11-22 20 views
15
過時Hashtable類

當我試圖使用Hashtable類,Netbeans的給了我一個錯誤說:更換在Java

仍然支持,但這些類是由JDK1.2集合類過時,並應該不會用於新的開發。

但是,我似乎無法找到一個更好的替代Hashtable網上的例子。有什麼建議麼?

+0

一般來說,你應該使用一個HashMap。 – user949300

回答

31

Hashtable的最直接替換是HashMap

在不同的是可能是很重要的是,Hashtable所有相關的方法是同步的,而他們是HashMap同步。

+2

如果您需要同步(由Hashtable提供),您可以使用['Collections.synchronizedMap()'](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html #synchronizedMap(java.util.Map))來裝飾普通的'HashMap'或使用['ConcurrentHashMap'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap .html),它允許在不需要鎖定的情況下同時進行讀取和修改。 –

+0

但是如果你有一個第三層庫需要一個HashMap或一個字典(HashMap的超類型),就像org.osgi.framework.BundleContext.registerService中的一個一樣,你將無法用HashMap替換Hashtable(字符串字符串,對象o,字典 dctnr)一個。 – javadev

3

你很可能使用的Hashmap:

Map<String, Integer> mymap = new HashMap<String, Integer>(); 
4

您應該使用HashMap,但它不是爲併發環境設計的,您可以在其中使用ConcurrentHashMap

OR

Map<K,V> myMap = Collections.synchronizedMap(/*any map instance*/); 
3

存在這樣的情況,當你控制範圍之外的方法需要Hashtable。 Java自己的javax.management.ObjectName是 這樣一個例子[1]

當外部接口需要它時,您必須使用Hashtable。 在NetBeans中,你可以使用:

@SupresssWarnings("UseOfObsoleteCollectionType") 

局部抑制警告。

1:我不知道爲什麼他們用Hashtable而不是HashMap,因爲ObjectName是 可用,因爲1.5和Hashtable是過時的,因爲1.2

0
  • 對於正常(即,非併發訪問) - 使用HashMap(通常通過Map接口)。
  • 如果你需要一個簡單的同步包裝爲現有的地圖 - 使用Collections.synchronizedMap(...)
  • 如果你需要一個課堂上認真和優化設計的併發訪問 - 使用的ConcurrentHashMap(通常是通過一個擴展ConcurrentMap接口具有附加併發功能的Map界面)。