【问题标题】:For general cases, when either one would work, which is better to use, a hashmap or a hashtable?对于一般情况,当任何一个都可以工作时,哪个更好用,hashmap 还是 hashtable?
【发布时间】:2010-02-15 20:44:58
【问题描述】:

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

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

  • 哪个更常用/更标准?

【问题讨论】:

    标签: java hashtable hashmap


    【解决方案1】:
    • 如果任何一个都适合您,我会使用 HashMap,因为 Hashtable 提供的同步会产生开销
    • 我想HashMap 更标准,使用频率更高。同步的Hashtable 在一定程度上已经被集合和并发框架的进步所取代。

    【讨论】:

      【解决方案2】:

      哈希表较旧。它已经在 J​​DK 1.0 中发布。在 1.2 中,当引入集合框架时,Hashtable 被认为是一个问题,因为它是在同步所有公共方法的情况下实现的。这是一种预防措施,仅在多线程上下文中是必需的,否则会损害性能(有些人表示可以优化掉,但是 YMMV)。

      不幸的是,仅仅删除同步是不可能的,因为一些代码已经依赖于以这种方式实现的 Hashtable。于是,HashMap 诞生了。当他们这样做时,他们加入了“允许空值”功能并将其调整到通用集合框架中。

      同样的事情发生在 StringBuffer 上,新的非同步版本被称为 StringBuilder。

      因此,简而言之:使用 HashMap:它是最新且最经过深思熟虑的实现。哈希表是遗留的。如果你想要一个同步的实现,你可以选择 Hashtable 或 Collections.synchronizedMap(Map)。

      【讨论】:

      • +1 提到 Hashtable 是遗留的 - 即使您有线程情况,使用同步的 Hashmap 而不是 Hashtable,或者最好将您的 hashmap 包装在您控制访问的对象中。
      • @Bill:实际上,Hashtable 的推荐替换(从 Java 5 开始)是 ConcurrentHashMap(在 java.util.concurrent 中),但对于针对 1.4 或更早版本的代码,我想是同步的 @ 987654324@ 适用于大多数用途。
      • 顺便说一下,ConcurrentHashMap 比普通的HashMap 更快,即使在单线程上下文中也是如此。不信你自己试试看:)
      【解决方案3】:

      HashMap 因为它运行得更快。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          • Hashtable 的访问在表上是同步的,而对HashMap 的访问则不是。您可以添加它,但默认情况下它不存在。

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

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

          因此,您可以使用HashMap 获取任何新代码。如果您需要同步,最好使用Collections.synchronizedMap(HashMap)。更多想法请见this similar SO thread。

          【讨论】:

          • 我已经在我的问题中链接到那个 SO 帖子。我想知道当你不关心空值或线程时使用哪个。
          【解决方案6】:

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

          【讨论】:

          • 方法参数应该使用Map,而不是HashMap
          • 不能将Map 的实例传递给方法。
          • 一个可以而且应该将 Map 的实现传递给一个方法,而不用指定该实现是什么的方法。这将是标准情况,当然也可能有例外。按合同设计。
          • 哦,而且作为方法参数,它不是线程安全的,除非它不被方法之外的任何其他线程访问。 Hashtable 是线程安全的。
          • 我认为很明显我们已经理解了这一点。我只是指出这一事实与@Chris Jester-Young 的评论无关。你说的好像是在反驳他的话。
          猜你喜欢
          • 1970-01-01
          • 2014-10-05
          • 2015-11-24
          • 2020-12-26
          • 2012-09-04
          • 2010-09-21
          • 2016-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多