2

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

我的问题是:

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

6 回答 6

1

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

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

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

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

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

hashtable 比 hasmap 内存效率高吗?

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

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

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

于 2014-01-13T19:11:39.493 回答
0

HashMap(或者,更有可能,HashSet)可能是一个不错的起点,就您而言。它并不完美,它确实比列表消耗更多的内存,但是当您需要快速添加、删除和包含操作时,它应该是您的默认设置。该String.hashCode()实现不是最好的散列函数,尽管它速度快,并且足以满足大多数目的。

于 2014-01-13T18:17:15.833 回答
0

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

于 2014-01-13T18:18:51.417 回答
0

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

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

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

于 2014-01-13T18:37:22.380 回答
0

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

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

于 2014-01-13T18:27:43.677 回答
0

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

作为开始,我建议HashSetTreeSet(如果订购很重要)。AHashMap将键映射到不同的值。请参阅此讨论HashMap以了解和之间的区别HashtableHashtable我个人自 2007 年以来就没有使用过。

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

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

于 2014-01-13T18:30:20.650 回答