对于一般情况,当任何一个工作时,哪个更好用,哈希映射或哈希表?

时间:2010-02-15 20:44:58

标签: java hashtable hashmap

我偶尔会用几种语言使用哈希表,但我在浏览一些代码时遇到了Java地图。我检查了this SO question中的差异,这非常清楚地表达了它。我的问题是:

  • 当任何一个可以为你工作时,哪个更好用?如果你处理空值/线程,你应该选择哪一个?

  • 哪一个更经常使用/更标准?

6 个答案:

答案 0 :(得分:7)

  • 如果其中任何一个适合您,我会使用HashMap,因为Hashtable提供的同步会产生开销
  • 我认为HashMap更标准,并且更经常使用。同步Hashtable在某种程度上已被集合和并发框架的进步所取代。

答案 1 :(得分:5)

Hashtable比较旧。它已经在JDK 1.0中发布了。在1.2中,当引入集合框架时,Hashtable被确定为一个问题,因为它是在所有公共方法同步的情况下实现的。这是一种预防措施,只有在多线程环境中才有必要,否则会损害性能(有些人已表示可以优化,但是YMMV)。

不幸的是,不可能只删除同步,因为某些代码已经依赖于以这种方式实现的Hashtable。因此,HashMap诞生了。当他们参与其中时,他们投入了'permit nulls'功能并将其改编为通用集合框架。

StringBuffer也是如此,新的非同步版本叫做StringBuilder。

因此,简而言之:使用HashMap:它是最新且最经过深思熟虑的实现。 Hashtable是遗产。如果需要同步实现,可以使用Hashtable或Collections.synchronizedMap(Map)。

答案 2 :(得分:1)

HashMap因为它运行得更快。

答案 3 :(得分:1)

对于一般用途,请选择HashMap,因为Hashtable已同步,因此会占用更多计算资源。

答案 4 :(得分:0)

Hashtable是Java中的原始集合类之一,而HashMap是Java 2中添加的集合框架的一部分。主要区别在于:

  • Hashtable的访问权限在桌面上同步,而HashMap则无法访问HashMap。您可以添加它,但默认情况下不存在。

  • Hashtable迭代器是故障安全的,而HashMap的枚举器不是。

  • Hashtable允许空值,而HashMap则不允许。

因此,您可以使用Collections.synchronizedMap(HashMap)获取任何新代码。如果您需要同步,最好使用{{1}}。有关更多提示,请参阅this similar SO threa d。

答案 5 :(得分:-2)

HashMap用于局部变量或方法参数,因为它们是线程安全的。