我曾在几种语言中偶尔使用哈希表,但是当我浏览一些代码时,我刚好遇到了 Java Map。我查阅了这个 SO 问题,其中非常清楚地表达了它们之间的区别。我的问题是:
当两者都可以使用时,哪一个更好?如果你不涉及 nulls/threads,应该选择哪一个?
哪一个更常用/更标准?
HashMap
,因为 Hashtable
提供的同步开销较大。HashMap
更标准,并且更常用。 同步的 Hashtable
在集合和并发框架方面已经在一定程度上被取代了。Hashtable是较早的数据结构,在JDK 1.0中已经被引入。在1.2版本中,集合框架被引入时,发现Hashtable的所有公共方法都是同步的,这是一种仅在多线程上下文中才需要的预防措施,否则会损害性能(有些人指出这可以被优化掉,但因情况而异)。
不幸的是,不能仅仅删除同步,因为一些代码已经依赖于Hashtable以这种方式实现。因此,HashMap应运而生。他们在这个过程中增加了“允许空值”的功能,并将其适应到通用集合框架中。
StringBuffer也遇到了同样的问题,新的非同步版本称为StringBuilder。
因此,简而言之:使用HashMap:它是最新和最完善的实现。Hashtable是遗留问题。如果您想要同步实现,可以选择Hashtable或Collections.synchronizedMap(Map)。
使用HashMap因为它运行速度更快。
一般情况下,选择HashMap
,因为Hashtable
是同步的,因此会消耗更多的计算资源。
Hashtable
是 Java 中最早的集合类之一,而 HashMap
则是随着 Java 2 添加到 Collections Framework 中的。它们的主要区别如下:
访问 Hashtable
时会在表上进行同步,而访问 HashMap
则不会。你可以添加它,但默认情况下没有。
HashMap
迭代器是安全的,而 Hashtable
的枚举器则不是。
HashMap
允许其中包含 null 值,而 Hashtable
不允许。
因此,在任何新代码中,您都应该选择 HashMap
。如果需要同步,则最好使用 Collections.synchronizedMap(HashMap)
。请参阅 this similar SO thread 以获取更多想法。
使用HashMap
来存储本地变量或方法参数,因为它们是线程安全的。
Map
,而不是HashMap
。 - C. K. YoungMap
的实例传递给一个方法。 - fastcodejava
ConcurrentHashMap
(在java.util.concurrent
中)来替代Hashtable
,但对于针对1.4或更早版本的代码,我认为同步的HashMap
对于大多数用途是合理的。 - C. K. YoungConcurrentHashMap
比普通的HashMap
更快。如果您不相信,请自行尝试 :) - Esko