何时应该使用 Hashtable 与 HashMap
Posted
技术标签:
【中文标题】何时应该使用 Hashtable 与 HashMap【英文标题】:When should I use a Hashtable versus a HashMap 【发布时间】:2012-03-21 02:53:21 【问题描述】:这不是关于 我知道Hashtable
和HashMap
之间差异的问题。Hashtable
对象不能接受键或值条目的null
值,它是同步集合,它使用的内存比HashMap
略少。
我想知道在哪些情况下使用Hashtable
而不是HashMap
更合适。
【问题讨论】:
与***.com/questions/40471/…重复 @MattWolfe 这不是那个问题的重复。这个问题超越了差异。我知道差异。我在问什么时候适合使用一个而不是另一个。 【参考方案1】:这不是关于
Hashtable
和HashMap
之间区别的问题
嗯,真的……
我想知道在哪些情况下使用
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 我只是为了涵盖所有基础而对内存进行了说明-实际上,内存差异非常小,可以忽略不计。我想知道是否有任何奇怪的极端情况,Hashtable
比HashMap
更有用。感谢您列举所有不同的场景!
看来我的 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
实现,例如ConcurrentHashMap
或ConcurrentSkipListMap
【讨论】:
【参考方案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——速度、内存以及何时使用它们? [关闭]