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%存储桶数
- 转到那个桶,计算等于()
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
元素的链接列表。您是对的,我的意思是集合中只有唯一的键,没有重复项。已更新。谢谢。还可以修改散列以更好地分配位