一般情况下,当两者都可以使用时,使用哈希表还是散列表更好?

3

我曾在几种语言中偶尔使用哈希表,但是当我浏览一些代码时,我刚好遇到了 Java Map。我查阅了这个 SO 问题,其中非常清楚地表达了它们之间的区别。我的问题是:

  • 当两者都可以使用时,哪一个更好?如果你不涉及 nulls/threads,应该选择哪一个?

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

6个回答

7
  • 如果两个都适用于您,我建议使用 HashMap,因为 Hashtable 提供的同步开销较大。
  • 我想 HashMap 更标准,并且更常用。 同步的 Hashtable 在集合和并发框架方面已经在一定程度上被取代了。

5

Hashtable是较早的数据结构,在JDK 1.0中已经被引入。在1.2版本中,集合框架被引入时,发现Hashtable的所有公共方法都是同步的,这是一种仅在多线程上下文中才需要的预防措施,否则会损害性能(有些人指出这可以被优化掉,但因情况而异)。

不幸的是,不能仅仅删除同步,因为一些代码已经依赖于Hashtable以这种方式实现。因此,HashMap应运而生。他们在这个过程中增加了“允许空值”的功能,并将其适应到通用集合框架中。

StringBuffer也遇到了同样的问题,新的非同步版本称为StringBuilder。

因此,简而言之:使用HashMap:它是最新和最完善的实现。Hashtable是遗留问题。如果您想要同步实现,可以选择Hashtable或Collections.synchronizedMap(Map)。


1
即使您面临线程情况,也请使用同步的HashMap而不是Hashtable,因为Hashtable已经过时。更好的做法是将您的HashMap封装在一个对象中,以便您可以控制访问。+1表示提到了Hashtable是遗留问题。 - Bill K
1
@Bill:实际上,Java 5 推荐使用 ConcurrentHashMap(在 java.util.concurrent 中)来替代 Hashtable,但对于针对1.4或更早版本的代码,我认为同步的 HashMap 对于大多数用途是合理的。 - C. K. Young
顺便说一下,在单线程环境中,ConcurrentHashMap 比普通的 HashMap 更快。如果您不相信,请自行尝试 :) - Esko

1

使用HashMap因为它运行速度更快。


1

一般情况下,选择HashMap,因为Hashtable是同步的,因此会消耗更多的计算资源。


0

Hashtable 是 Java 中最早的集合类之一,而 HashMap 则是随着 Java 2 添加到 Collections Framework 中的。它们的主要区别如下:

  • 访问 Hashtable 时会在表上进行同步,而访问 HashMap 则不会。你可以添加它,但默认情况下没有。

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

  • HashMap 允许其中包含 null 值,而 Hashtable 不允许。

因此,在任何新代码中,您都应该选择 HashMap。如果需要同步,则最好使用 Collections.synchronizedMap(HashMap)。请参阅 this similar SO thread 以获取更多想法。


我已经在我的问题中链接了那个SO帖子。我想知道在不关心null或线程时应该使用哪个。 - froadie

-2

使用HashMap来存储本地变量或方法参数,因为它们是线程安全的。


5
方法参数应该使用Map,而不是HashMap - C. K. Young
不能将 Map 的实例传递给一个方法。 - fastcodejava
2
一个方法可以并且应该传递一个 Map 的实现,而不需要指定这个实现是什么。当然,也许会有例外情况。契约式设计。 - Robin
1
哦,作为方法参数时,它不是线程安全的,除非它没有被方法之外的任何其他线程访问。哈希表是线程安全的。 - Robin
1
我认为我们已经很明显地理解了这个。我只是指出这个事实与@ Chris Jester-Young所说的评论无关。你将它陈述得好像它在反驳他所说的话一样。 - Robin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接