Java Hashtable还是HashMap?

3

我一直在研究寻找更快的列表替代方法。在一个算法书中,hashtable 似乎是使用分离链接法最快的方法。然后我发现 Java 实现了 hashtable,从我所读的资料来看它似乎也使用了分离链接法。然而,由于存在同步开销,因此建议使用 hashmap 来替代 hashtable

我的问题是:

  • Java 中的 hashmap 是否是插入/删除/搜索最快的数据结构?
  • 在阅读过程中,有些帖子对 hashmap 的内存使用量表示担忧。其中一篇帖子提到,一个空的 hashmap 占用 300 字节。相比之下,hashtable 是否更加内存高效?
  • 此外,每个 hash 函数对于 strings 来说是否都是最有效的?

4
如果有一种数据结构对所有情况都最有效率,那么就不需要任何其他数据结构。现在请解释你的情境。 - Rohit Jain
我认为这取决于您使用的数据类型和预期的场景。您能否请解释一下您应用程序的需求?另外,您可以设置hashMap的初始容量,而不是使用默认值。 - android developer
哈希表可以是“空的”,但仍需要基本数组 - 该数组的大小取决于您创建的哈希表的大小。 - Bernhard Barker
6个回答

1
由于缺少太多上下文,无法回答这个问题,建议您使用最简单的选项,不用担心性能问题,直到您测量出有问题为止。
Java HashMap是在Java中实现插入/删除/搜索最快的数据结构吗?
根据您需要的情况,ArrayList比HashMap要快得多。我看到有人在应该使用对象时使用Map。在这种情况下,自定义类实例可以快10倍且更小。
在阅读时,一些帖子对hashmap的内存使用有所担忧。其中一篇文章提到一个空的hashmap占用300字节。
除非您知道300字节(成本低于您以最低工资眨眼睛的费用)很重要,否则我会认为它并不重要。
Hashtable比hasmap更节省内存吗?
可以,但差别不大,Hashtable默认从较小的大小开始。如果您使用较小的容量创建HashMap,则其大小将更小。
另外,每个哈希函数对于字符串来说是否都是最有效的?
在一般情况下,它已经足够高效了。在极少数情况下,您可能希望更改策略,例如防止拒绝服务攻击。如果您真的关心内存效率和性能,也许您首先不应该使用String。

0

HashMap(或者更可能是HashSet)可能是你的起点。它不是完美的,而且它消耗的内存比如列表等数据结构多,但当你需要快速添加、删除和包含操作时,它应该是你的默认选择。虽然String.hashCode()实现不是最好的哈希函数,但它很快,并且对于大多数目的来说足够好。


0

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


0

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

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


0

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

首先,我建议使用 HashSetTreeSet(如果排序很重要)。HashMap 将键映射到值,这是不同的。请参考 this discussion 以了解 HashMapHashtable 之间的区别。自 2007 年以来,我个人从未使用过 Hashtable

最后,如果您不介意使用第三方库,我强烈推荐看一下 Guava 不可变集合。不可变性自动提供线程安全性和更易于理解的程序。

编辑: 关于效率问题,这是无关紧要的。作为指南,使用最适合您问题的数据结构(就数据结构的抽象概念而言),并选择可用的基本实现。如果您可以证明您的代码存在性能问题,那么您可能会开始考虑使用更高效的东西。这是引号,因为它是一个非常宽泛的定义:我们是在谈论内存效率、计算时间效率、垃圾收集效率还是其他什么?永远不要忘记 代码优化规则


0

1. HashMap 是 Java 中实现插入/删除/搜索最快的数据结构之一,HashSet 在插入/删除/搜索方面与 HashMap 一样快,而 ArrayList 在向结尾插入元素时与 HashMap 一样快。

2. Hashtable 不比 HashMap 更节省内存,它们都是通过分离链接来实现的。

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


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