在大多数情况下,HashSet
的查找复杂度 O(1)。我知道这是因为对象保存在与对象的哈希码相对应的桶中。
当查找完成后,直接进入存储桶并找到(使用等于同一存储桶中存在多个对象的元素)元素。
我一直在想,直接如何进入所需的存储桶?哪个算法用于存储桶查找?这对总查找时间没有任何影响吗?
答案 0 :(得分:4)
我一直在想,它是如何直接进入所需的桶的?
哈希码为treated,用作数组的索引。
索引由hash & (array.length - 1)
确定,因为Java HashMap的内部数组的长度始终是2的幂。(这是hash % array.length
的更便宜的计算。)
每个"桶"实际上是一个链表(现在,可能是树),其中具有冲突哈希的条目被分组。如果存在冲突,则执行对桶的线性搜索。
这对总查找时间没有任何影响吗?
它会从内存中产生一些负载的成本。
答案 1 :(得分:2)
答案 2 :(得分:1)
从内存中:HashSet实际上是由HashMap支持的,基本的查找过程是:
对于Set,只有唯一的元素。我建议阅读HashSet的源代码,它应该能够回答你的问题。
另请注意,Java 8代码已更新,此解释涵盖了Java 8之前的代码库。我没有仔细研究过Java 8的实现,只是发现它不同。