【问题标题】:When should I use a Hashtable versus a HashMap何时应该使用 Hashtable 与 HashMap
【发布时间】:2012-03-21 02:53:21
【问题描述】:

这不是关于HashtableHashMap 之间差异的问题。 我知道Hashtable 对象不能接受键或值条目的null 值,它是同步集合,它使用的内存比HashMap 略少。

我想知道在哪些情况下使用Hashtable 而不是HashMap 更合适。

【问题讨论】:

  • @MattWolfe 这不是那个问题的重复。这个问题超越了差异。我知道差异。我在问什么时候适合使用一个而不是另一个。

标签: java collections hashmap hashtable


【解决方案1】:

这不是关于HashtableHashMap之间区别的问题

嗯,真的……

我想知道在哪些情况下使用Hashtable 而不是HashMap 更合适。

正是当您想要两者之间的差异时:

  • 当您想在 Java 1.1 上运行时
  • 当您希望每个操作都同步时(获得线程安全的形式,只要您从不对其进行迭代) - 并且出于某种原因不想使用 Collections.synchronizedMap超过HashMap
  • 当您不想存储空值时
  • 当内存差异实际上很显着时(只有在您证明是这种情况之后)- 我个人什至没有意识到这种差异...
  • 当你被一个返回或接受 Hashtable 的讨厌的 API 逼迫时(幸运的是,相对罕见)

我个人不记得上次遇到这种情况是什么时候了 - 我想说在现代 Java 代码中使用 Hashtable 是非常罕见的。

【讨论】:

  • 只需从 java 1.6 开始添加,您将获得 HashTable 作为过时的集合。
  • @thinksteep:真的吗?我在 1.6 文档中没有看到任何弃用通知:docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html
  • @JonSkeet 我只是为了涵盖所有基础而对内存进行了说明-实际上,内存差异非常小,可以忽略不计。我想知道是否有任何奇怪的极端情况,HashtableHashMap 更有用。感谢您列举所有不同的场景!
  • 看来我的 netbeans 误导了。
  • @VivinPaliath:也添加了对 skaffman 答案的概括。
【解决方案2】:

从不。

Hashtable 是 Java 1 中映射的原始实现。它已被Java Collections Framework 中定义的Map<K,V> 实现所取代。当然,Hashtable 已被改造以实现 Map,但这并不是非常有用。

它的主要问题在于它是同步的。这意味着它在线程之间共享的任何情况下都会很慢。 ConcurrentHashMap 在这种情况下是更好的选择。如果您在单线程上运行,那么不同步的HashMap 是更好的选择。

【讨论】:

    【解决方案3】:

    在 JNDI 中使用 InitialContext

    我只能想到一个正当的理由 - 当您使用需要它的 API 时,例如 JNDI 非常烦人的 InitialContext 类。

    除此之外,我完全看不出使用Hashtable 的充分理由。您可以使用Collections.synchronizedMap 获得HashMap 的同步版本,或使用ConcurrentMap 实现,例如ConcurrentHashMapConcurrentSkipListMap

    【讨论】:

      【解决方案4】:

      我只在旧版应用程序/库中看到哈希表。

      如果可以,如果需要同步 Map,请使用 ConcurrentHashMap 或 Collections.synchronizedMap。

      http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

      http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29

      【讨论】:

        【解决方案5】:

        知道何时使用一个类或结构而不是另一个,本质上就是理解两者之间的差异,并根据这些差异决定哪一个最适合手头的问题。

        我了解 Hashtable 对象不能接受空值

        所以在需要存储空值的情况下,Hashtable 不合适。

        此外,在Hashtable 中,枚举不是故障安全的。因此,如果您需要能够在枚举时更改结构的内容,Hashtable 会更合适。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-30
          • 1970-01-01
          • 2016-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          相关资源
          最近更新 更多