【问题标题】:Java hashtable or hashmap? [duplicate]Java哈希表或哈希图? [复制]
【发布时间】:2014-02-01 14:51:54
【问题描述】:

我一直在研究寻找更快的列表替代方案。在一本算法书中,hashtable 似乎是使用单独链接最快的。然后我发现java有一个hashtable的实现,从我读到的它似乎使用了单独的链接。但是,存在同步开销,因此建议使用hashmap 作为hashtable 的更快替代方案。

我的问题是:

  • javahashmap是java实现最快的数据结构吗 插入/删除/搜索?
  • 在阅读时,有几篇帖子对 hashmap。一个帖子提到一个空的hashmap占300 字节。 hashtable 是否比 hasmap 更节省内存?
  • 另外,hash 函数是每个函数中最有效的 strings?

【问题讨论】:

  • 如果任何一种数据结构在所有情况下都是最有效的,那么根本不需要任何其他数据结构。现在请解释你的场景。
  • 我认为这取决于您使用的数据类型和预期的场景。你能解释一下你的应用程序的需求吗?顺便说一句,您可以设置 hashMap 的初始容量,而不是使用默认容量。
  • 哈希表可以是“空的”,但仍需要相应的基本数组 - 该数组的大小取决于您制作的哈希表有多大。

标签: java algorithm hashmap hashtable hashalgorithm


【解决方案1】:

缺少太多上下文,无法回答这个问题,该问题向我建议您应该使用最简单的选项,并且在您测量出问题之前不要担心性能。

java hashmap 是 java 中实现插入/删除/搜索最快的数据结构吗?

ArrayList 比 HashMap 快得多,具体取决于您的需要。我见过人们在应该使用对象时使用地图。在这种情况下,自定义类实例可以快 10 倍且更小。

在阅读时,一些帖子对 hashmap 的内存使用存在担忧。一篇文章提到空的 hashmap 占用 300 个字节。

除非您知道 300 字节(它的成本低于眨眼的最低工资)很重要,否则我认为它不重要。

hashtable 是否比 hasmap 更节省内存?

这可能但还不够重要。默认情况下,Hashtable 以较小的大小开始。如果你做一个容量较小的HashMap,它会更小。

另外,每个中的哈希函数对字符串最有效吗?

在一般情况下,它足够有效。在极少数情况下,您可能需要更改策略,例如防止拒绝服务攻击。如果您真的关心内存效率和性能,也许您一开始就不应该使用 String。

【讨论】:

    【解决方案2】:

    HashMap(或者,更有可能是HashSet)在您看来可能是一个不错的起点。它不是完美,而且它确实比 e.g. 消耗更多的内存。一个列表,但当您需要快速添加、删除和包含操作时,它应该是您的默认设置。 String.hashCode() 实现并不是最好的散列函数,尽管它速度很快,而且对于大多数用途来说已经足够了。

    【讨论】:

      【解决方案3】:

      HashMap(我相信也是 HashTable)的访问时间是 O(1),因为在 put() 期间给定值的内部存储桶位置是通过计算(值的键的哈希)%(总数桶)。这个 O(1) 是平均访问时间,如果有多少键散列到同一个桶,那么访问时间将趋于 O(n),因为所有值都放在同一个桶中,并且它们都以链表的方式增长。

      正如你所说,考虑到 Hashtable 内部的同步开销,我可能会选择 Hash map。此外,您可以通过设置各种参数(如提供内存优化手段的负载因子)来微调 Hashmap。我投票给 HashMap...

      【讨论】:

        【解决方案4】:

        正如您所指出的,Hashtable 是完全同步的,因此它取决于您的环境。如果你有很多线程,那么 ConcurrentHashMap 将是更好的解决方案。但是您可以查看Trove4J - 也许它会更好地满足您的需求。 Trove 使用类似于哈希表的链式哈希

        【讨论】:

          【解决方案5】:

          1.HashMap只是java中实现插入/删除/搜索最快的数据结构之一,HashSet的插入/删除/搜索速度与HashMap一样快,ArrayList在插入元素时与HashMap一样快结束。

          2.Hashtable的内存效率并不比HashMap高,都是单独链式实现的。

          3.这两种数据结构的哈希函数是相同的,但是你可以写一个子类扩展它们然后重写哈希函数以使其最适合你的应用程序。

          【讨论】:

            【解决方案6】:

            正如其他人指出的那样,集合可以很好地替代列表,但不要忘记列表允许重复元素,而集合不允许,因此虽然某些操作更快,例如存在,但集合和列表代表解决方案针对不同的问题。

            首先我推荐HashSetTreeSet(以防订购很重要)。 HashMap 将键映射到不同的值。请参阅this discussion 以了解HashMapHashtable 之间的区别。我个人自 2007 年以来就没有使用过Hashtable

            最后,如果您不介意使用第三方库,我强烈建议您查看Guava immutable collections。不变性自动提供线程安全和更易于理解的程序。

            编辑:关于效率问题,这是一个有争议的问题。作为指导,使用最适合您的问题的数据结构(如数据结构的抽象概念)并选择可用的 vanilla 实现。如果你能证明你的代码存在性能问题,你可能会开始考虑使用“更高效”的东西。之所以引用,是因为它是一个非常宽松的定义:我们在谈论内存效率、计算时间效率、垃圾收集效率等吗?永远不要忘记rules for code optimization

            【讨论】:

              猜你喜欢
              • 2013-03-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-13
              • 1970-01-01
              • 2013-01-10
              • 2012-12-25
              • 2023-03-31
              相关资源
              最近更新 更多