用于桶查找哈希码的算法

时间:2015-02-25 07:07:54

标签: java algorithm hashcode

在大多数情况下,HashSet的查找复杂度 O(1)。我知道这是因为对象保存在与对象的哈希码相对应的桶中。

当查找完成后,直接进入存储桶并找到(使用等于同一存储桶中存在多个对象的元素)元素。

我一直在想,直接如何进入所需的存储桶?哪个算法用于存储桶查找?这对总查找时间没有任何影响吗?

3 个答案:

答案 0 :(得分:4)

  

我一直在想,它是如何直接进入所需的桶的?

哈希码为treated,用作数组的索引。

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

每个"桶"实际上是一个链表(现在,可能是树),其中具有冲突哈希的条目被分组。如果存在冲突,则执行对桶的线性搜索。

  

这对总查找时间没有任何影响吗?

它会从内存中产生一些负载的成本。

答案 1 :(得分:2)

通常,算法只是

hash = hashFunction(key)
index = hash % arraySize

有关详细信息,请参阅哈希表上的the wikipedia article

答案 2 :(得分:1)

从内存中:HashSet实际上是由HashMap支持的,基本的查找过程是:

  • 获取密钥
  • 哈希(hashcode())
  • hashcode%桶数
  • 转到那个桶并评估equals()

对于Set,只有唯一的元素。我建议阅读HashSet的源代码,它应该能够回答你的问题。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.containsKey%28java.lang.Object%29

另请注意,Java 8代码已更新,此解释涵盖了Java 8之前的代码库。我没有仔细研究过Java 8的实现,只是发现它不同。