我偶尔会用几种语言使用哈希表,但我在浏览一些代码时遇到了Java地图。我检查了this SO question中的差异,这非常清楚地表达了它。我的问题是:
当任何一个可以为你工作时,哪个更好用?如果你不处理空值/线程,你应该选择哪一个?
哪一个更经常使用/更标准?
答案 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
用于局部变量或方法参数,因为它们是线程安全的。