【发布时间】:2010-02-15 20:44:58
【问题描述】:
我偶尔会在几种语言中使用哈希表,但我只是在浏览一些代码时遇到了 Java 映射。我查了this SO question的差异,表达的很清楚。我的问题是这样的:
当任何一个都可以为您工作时,哪个更好用?如果您不处理空值/线程...,您应该选择哪一个?
哪个更常用/更标准?
【问题讨论】:
我偶尔会在几种语言中使用哈希表,但我只是在浏览一些代码时遇到了 Java 映射。我查了this SO question的差异,表达的很清楚。我的问题是这样的:
当任何一个都可以为您工作时,哪个更好用?如果您不处理空值/线程...,您应该选择哪一个?
哪个更常用/更标准?
【问题讨论】:
HashMap,因为 Hashtable 提供的同步会产生开销HashMap 更标准,使用频率更高。同步的Hashtable 在一定程度上已经被集合和并发框架的进步所取代。 【讨论】:
哈希表较旧。它已经在 JDK 1.0 中发布。在 1.2 中,当引入集合框架时,Hashtable 被认为是一个问题,因为它是在同步所有公共方法的情况下实现的。这是一种预防措施,仅在多线程上下文中是必需的,否则会损害性能(有些人表示可以优化掉,但是 YMMV)。
不幸的是,仅仅删除同步是不可能的,因为一些代码已经依赖于以这种方式实现的 Hashtable。于是,HashMap 诞生了。当他们这样做时,他们加入了“允许空值”功能并将其调整到通用集合框架中。
同样的事情发生在 StringBuffer 上,新的非同步版本被称为 StringBuilder。
因此,简而言之:使用 HashMap:它是最新且最经过深思熟虑的实现。哈希表是遗留的。如果你想要一个同步的实现,你可以选择 Hashtable 或 Collections.synchronizedMap(Map)。
【讨论】:
Hashtable 的推荐替换(从 Java 5 开始)是 ConcurrentHashMap(在 java.util.concurrent 中),但对于针对 1.4 或更早版本的代码,我想是同步的 @ 987654324@ 适用于大多数用途。
ConcurrentHashMap 比普通的HashMap 更快,即使在单线程上下文中也是如此。不信你自己试试看:)
HashMap 因为它运行得更快。
【讨论】:
一般使用选择HashMap,因为Hashtable是同步的,因此会消耗更多的计算资源。
【讨论】:
Hashtable 是 Java 中的原始集合类之一,而HashMap 是 Java 2 添加的 Collections Framework 的一部分。主要区别在于:
对Hashtable 的访问在表上是同步的,而对HashMap 的访问则不是。您可以添加它,但默认情况下它不存在。
HashMap 迭代器是故障安全的,而 Hashtable 的枚举器则不是。
HashMap 允许其中包含空值,而 Hashtable 不允许。
因此,您可以使用HashMap 获取任何新代码。如果您需要同步,最好使用Collections.synchronizedMap(HashMap)。更多想法请见this similar SO thread。
【讨论】:
HashMap 用于局部变量或方法参数,因为它们是线程安全的。
【讨论】:
Map,而不是HashMap。
Map 的实例传递给方法。