用Java替换过时的Hashtable类

时间:2011-11-22 06:59:50

标签: java

当我尝试使用哈希表类时,Netbeans给了我一个错误说:

  

虽然仍然支持,但这些类已被JDK1.2集合类淘汰,并且可能不应该用于新开发。

但是,我似乎无法在网上找到更好地替换Hashtable的示例。有什么建议吗?

6 个答案:

答案 0 :(得分:33)

Hashtable最直接的替换是HashMap

可能重要的一个区别是Hashtable的所有相关方法在HashMap同步时会同步。

答案 1 :(得分:7)

Hashtable更好地替换HashMap

至于过时,我没有提及它,但Javadoc声明:

  

从Java 2平台v1.2开始,这个类被改装为   实现Map接口,使其成为。{   Java Collections Framework

Hashtable不同,

HashMap已同步。

答案 2 :(得分:4)

您应该使用HashMap,但它不适用于可以使用ConcurrentHashMap的并发环境。

OR

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

答案 3 :(得分:3)

您可以使用Hashmap:

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

答案 4 :(得分:3)

有些情况下,您控制之外的方法需要Hashtable。 Java自己的javax.management.ObjectName是 这样的例子 [1]

当外部接口需要时,您必须使用Hashtable。 在netbeans中,您可以使用:

@SupresssWarnings("UseOfObsoleteCollectionType")

在本地禁止警告。

1:我想知道为什么他们使用Hashtable而不是HashMap,因为ObjectName是 自1.5以来可用,Hashtable自1.2以来已过时。

答案 5 :(得分:1)

<强>摘要

最接近的替代品是HashMap(通常通过Map界面)。

但请注意,Hashtable是线程安全的,而HashMap则不是。 在大多数情况下这不是问题,并且有意使大多数Java集合非线程安全,以避免大多数常见场景的性能损失。但是如果你依赖Hashtable线程安全并且现在需要一个也是线程安全的替换,那么你有两个选择:

  • 如果您需要现有Map的简单同步包装器 - 请使用Collections.synchronizedMap(...)
  • 如果您需要一个仔细且经过优化设计的类来进行并发访问 - 请使用ConcurrentHashMap(通常通过ConcurrentMap接口扩展Map接口以及其他并发功能)。