Java哈希表还是哈希映射?

Java哈希表还是哈希映射?,java,algorithm,hashmap,hashtable,hashalgorithm,Java,Algorithm,Hashmap,Hashtable,Hashalgorithm,我一直在研究寻找一种比列表更快的选择。在一本算法书中,hashtable似乎是使用单独链接最快的。然后我发现java有一个哈希表的实现,据我所知,它似乎使用了单独的链接。但是,存在同步开销,因此建议使用hashmap作为hashtable的更快替代方案 我的问题是: javahashmap是用java实现的最快的数据结构吗 插入/删除/搜索 在阅读过程中,有几篇文章关注的是 hashmap。一篇帖子提到一个空的hashmap300 字节。hashtable是否比hasmap更高效 另外,每个函

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

我的问题是:

  • java
    hashmap
    是用java实现的最快的数据结构吗 插入/删除/搜索
  • 在阅读过程中,有几篇文章关注的是
    hashmap
    。一篇帖子提到一个空的
    hashmap
    300 字节。
    hashtable
    是否比
    hasmap
    更高效
  • 另外,每个函数中的
    hash
    函数对于
    字符串

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

      正如您所指出的,哈希表是完全同步的,因此它取决于您的环境。如果您有许多线程,那么ConcurrentHashMap将是更好的解决方案。不过你可以看看——也许它更适合你的需要。Trove使用类似于哈希表的链式哈希

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


      正如您所说,考虑到哈希表内部的同步开销,我可能会选择哈希映射。此外,您还可以通过设置Hashmap的各种参数(如提供内存优化方法的加载因子)来微调Hashmap。我投票支持HashMap…

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

      首先,我推荐
      HashSet
      TreeSet
      (以防排序很重要)。
      HashMap
      将键映射到不同的值。请参阅以了解
      HashMap
      Hashtable
      之间的区别。自2007年以来,我个人从未使用过
      哈希表

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


      编辑:关于效率问题,这是一个没有实际意义的观点。作为指导原则,使用最适合您的问题的数据结构(如数据结构的抽象概念),并选择可用的普通实现。如果您能证明代码中存在性能问题,您可能会开始考虑使用“更高效”的东西。引用这句话是因为它是一个非常松散的定义:我们谈论的是内存效率、计算时间效率、垃圾收集效率等等。永远不要忘记。

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

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


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

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

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

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

      阅读时,有几篇文章担心hashmap的内存使用。一篇帖子提到一个空的hashmap占用300字节

      除非你知道300字节(比你眨眼的最低工资要便宜)很重要,否则我认为它不重要

      哈希表的内存效率是否比hasmap高

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

      另外,每个函数中的哈希函数对于字符串来说是最有效的吗


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

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