何时应该使用 Hashtable 与 HashMap

Posted

技术标签:

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

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

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

【问题讨论】:

与***.com/questions/40471/…重复 @MattWolfe 这不是那个问题的重复。这个问题超越了差异。我知道差异。我在问什么时候适合使用一个而不是另一个。 【参考方案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 会更合适。

【讨论】:

以上是关于何时应该使用 Hashtable 与 HashMap的主要内容,如果未能解决你的问题,请参考以下文章

hashMap与 hashTable , ArrayList与linkedList 的区别(详细)

何时何地使用 Dictionary verses Hashtable? [复制]

.Net 数据结构:ArrayList、List、HashTable、Dictionary、SortedList、SortedDictionary——速度、内存以及何时使用它们? [关闭]

ArrayList与LinkedList区别

Map

我应该如何以及何时将倾斜指针与 cuda API 一起使用?