用于哈希码桶查找的算法

Algorithm used for bucket lookup for hashcodes

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

查找完成后,它直接进入存储桶并查找(如果同一存储桶中存在多个对象,则使用 equals)元素。

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

通常,算法很简单

hash = hashFunction(key)
index = hash % arraySize

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

记忆中:HashSet 实际上是由 HashMap 支持的,基本的查找过程是:

  • 拿到钥匙
  • 对其进行哈希处理 (hashcode())
  • hashcode %桶数
  • 转到那个桶并计算 equals()

对于一个集合,只有唯一的元素。我建议阅读 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 的实现,只是想知道它是不同的。

I always wonder, how it directly goes to the required bucket?

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

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

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

Does that add nothing to total lookup time?

它会产生一些内存加载的成本。