Java 用于哈希代码的bucket查找的算法

Java 用于哈希代码的bucket查找的算法,java,algorithm,hashcode,Java,Algorithm,Hashcode,在大多数情况下,HashSet具有查找复杂性O(1)。我理解这是因为对象被保存在与对象的hashcode相对应的bucket中 完成查找后,它直接转到bucket并查找(如果同一个bucket中存在多个对象,则使用equals)元素 我总是想知道,它是如何直接进入所需的桶的?哪种算法用于bucket查找?这不会增加总的查找时间吗?通常,算法很简单 hash = hashFunction(key) index = hash % arraySize 有关详细信息,请参见哈希表。内存:哈希集实际上由

在大多数情况下,
HashSet
具有查找复杂性O(1)。我理解这是因为对象被保存在与对象的hashcode相对应的bucket中

完成查找后,它直接转到bucket并查找(如果同一个bucket中存在多个对象,则使用equals)元素


我总是想知道,它是如何直接进入所需的桶的?哪种算法用于bucket查找?这不会增加总的查找时间吗?

通常,算法很简单

hash = hashFunction(key)
index = hash % arraySize

有关详细信息,请参见哈希表。

内存:哈希集实际上由哈希映射支持,基本查找过程是:

  • 拿到钥匙
  • 散列它(hashcode())
  • hashcode%存储桶数
  • 转到那个桶,计算等于()
对于一个集合,只有唯一的元素。我建议阅读HashSet的源代码,它应该能够回答您的查询

还要注意,Java8代码已经更新,本说明涵盖了Java8之前的代码库。我没有详细研究Java8实现,只是想弄清楚它是不同的

我总是想知道,它是如何直接进入所需的桶的

散列码是数组的索引,并用作数组的索引

索引由
hash&(array.length-1)
确定,因为Java HashMap的内部数组的长度始终是2的幂。(这是对
哈希%array.length
的更便宜的计算)

每个“bucket”实际上是一个链表(现在可能是一棵树),其中包含冲突哈希的条目被分组。如果存在碰撞,则通过铲斗执行线性搜索

这不会增加总的查找时间吗


它需要从内存中加载一些内容。

这个词是“算法”。它由一个专有名称派生而来。缩写不允许,实际上毫无意义。将从下次开始注意:)基本上,bucket[o.hashCode()%bucket.length]。它基本上是从数组访问索引i。因此,没有查找时间来达到索引i。i由哈希代码%array.length计算得出;hashcode是根据has函数计算的。虽然它需要一些恒定的时间,O(1)表示它不取决于元素的大小。每个答案都提供了更多的洞察力!!我不能全部接受:(在一个集合中,每个bucket只能有一个元素不是真的,它们将在同一个bucket中结束。在您链接的源代码中,您甚至可以看到每个bucket都有一个
Entry
元素的链接列表。您是对的,我的意思是集合中只有唯一的键,没有重复项。已更新。谢谢。还可以修改散列以更好地分配位