【问题标题】:Replacement for obsolete Hashtable class in Java替换 Java 中过时的 Hashtable 类
【发布时间】:2012-01-03 14:52:25
【问题描述】:

当我尝试使用 hashtable 类时,Netbeans 给我一个错误提示:

虽然仍受支持,但这些类已被 JDK1.2 集合类淘汰,可能不应该在新的开发中使用。

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

【问题讨论】:

  • 一般来说,你应该使用HashMap。

标签: java


【解决方案1】:

Hashtable 的最直接替换是HashMap

可能很重要的一个区别是Hashtable 的所有相关方法都是同步的,而它们在HashMap同步。

【讨论】:

  • 如果需要同步(Hashtable提供),可以使用Collections.synchronizedMap()装饰一个普通的HashMap,或者使用ConcurrentHashMap,无需加锁即可并发读取和修改。
  • 但是如果你有第三层库需要 HashMap 或 Dictionary(HashMap 的超类型),就像 org.osgi 中的那样,你将无法用 HashMap 替换 Hashtable .framework.BundleContext.registerService(String string, Object o, Dictionary dctnr) 一。
【解决方案2】:

你可能会使用 Hashmap:

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

【讨论】:

    【解决方案3】:

    Hashtable 的更好替代品是 HashMap

    至于过时,我没有提及它,但 Javadoc 指出:

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

    HashtableHashMap 不同的是同步的。

    【讨论】:

      【解决方案4】:

      你应该使用HashMap,但它不是为并发环境设计的,你可以使用ConcurrentHashMap

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

      【讨论】:

        【解决方案5】:

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

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

        @SupresssWarnings("UseOfObsoleteCollectionType")
        

        在本地抑制警告。

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

        【讨论】:

          【解决方案6】:

          总结

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


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

          • 如果您需要对现有地图使用简单的同步包装器 - 请使用 Collections.synchronizedMap(...)
          • 如果您需要一个为并发访问精心设计且经过优化设计的类 - 请使用 ConcurrentHashMap(通常通过 ConcurrentMap 接口,该接口扩展了具有附加并发功能的 Map 接口)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-14
            • 1970-01-01
            • 2010-11-15
            • 2011-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多