用于哈希码桶查找的算法
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 的源代码,它应该能够回答您的问题。
另请注意,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?
它会产生一些内存加载的成本。
在大多数情况下,HashSet
的查找复杂度为 O(1)。我理解这是因为对象保存在与对象的哈希码对应的桶中。
查找完成后,它直接进入存储桶并查找(如果同一存储桶中存在多个对象,则使用 equals)元素。
我一直在想,它是如何直接进入所需的桶的?哪种算法用于桶查找?这不会增加总查找时间吗?
通常,算法很简单
hash = hashFunction(key)
index = hash % arraySize
有关哈希 Table 的详细信息,请参阅 the wikipedia article。
记忆中:HashSet 实际上是由 HashMap 支持的,基本的查找过程是:
- 拿到钥匙
- 对其进行哈希处理 (hashcode())
- hashcode %桶数
- 转到那个桶并计算 equals()
对于一个集合,只有唯一的元素。我建议阅读 HashSet 的源代码,它应该能够回答您的问题。
另请注意,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?
它会产生一些内存加载的成本。