Java哈希表或哈希映射?

时间:2014-01-13 18:14:50

标签: java algorithm hashmap hashtable hashalgorithm

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

我的排队是:

  • java hashmap是java中实现的最快的数据结构 插入/删除/搜索?
  • 在阅读时,一些帖子担心内存的使用情况 hashmap。一篇文章提到空hashmap占据300 字节。 hashtable的内存效率是hasmap吗?
  • 此外,每个hash函数最有效 strings

6 个答案:

答案 0 :(得分:0)

HashMap(或者更可能是HashSet)可能是您开始的好地方。它不是完美,它消耗的内存比例如列表,但是当您需要快速添加,删除和包含操作时,它应该是您的默认值。 String.hashCode()实现不是最好的哈希函数,虽然它很快,并且足以满足大多数目的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

正如你所说的考虑Hashtable中同步的开销,我可能会选择哈希映射。此外,您可以通过设置各种参数来调整Hashmap,例如加载因子,它提供了内存优化的方法。我投票支持HashMap ......

答案 3 :(得分:0)

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

首先,我建议HashSetTreeSet(如果订购很重要)。 HashMap将键映射到不同的值。请参阅this discussion以了解HashMapHashtable之间的差异。我个人自2007年以来没有使用Hashtable

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

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

答案 4 :(得分:0)

1.HashMap只是java中实现插入/删除/搜索的最快数据结构之一,HashSet与插入/删除/搜索的HashMap一样快,并且当向元素插入元素时,ArrayList与HashMap一样快。端。

2.Hashtable的内存效率不比HashMap高,它们都是通过单独链接实现的。

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

答案 5 :(得分:0)

有太多的背景缺失能够回答这个问题,这个问题告诉我你应该使用最简单的选项而不用担心性能,直到你测量到你有问题为止。

  

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

ArrayList明显比HashMap快,具体取决于你需要它。我见过人们在使用地图时会使用地图。在这种情况下,自定义类实例可以更快,更小。

  

在阅读时,有些帖子担心hashmap的内存使用情况。一篇帖子提到空的hashmap占用300个字节。

除非你知道300字节(费用低于最低工资要支付的费用),否则我认为不会。

  

hashtable的内存效率是否比hasmap更高?

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

  

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

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

相关问题