我已阅读here,
对象的哈希码允许放置算法和数据结构 对象进入隔间,就像打印机类型中的字母类型一样 案件。打印机将所有“A”类型放入“A”的隔间中,并且 他只在这个隔间里寻找一个“A”。这个简单的系统 让他找到类型比在未分类的抽屉中搜索要快得多。 这也是基于散列的集合的概念,例如HashMap和HashSet。
但我没有得到它。这里提到了什么 idea ? HashMap或HashSet如何与哈希码相关?
编辑:
以HashSet
为例。
假设存储了7个对象(让我们用字母表示它们),它们可以是从A到E的任何东西。所以说它在第0个索引位置有A,在第1个位置有B,在第二个位置有A,在第三个索引有A,然后A再次在第四个指数,然后D在第五个指数,E在第六个指数。等等。这是一种存储形式。
hashSet => [A,B,C,A,A,D,E]
然后还有另一种形式的存储,其中所有三个A都进入一个隔间,然后B进入另一个隔间,C进入另一个隔间,D和E进入另外两个隔间。
基于hashCode的分类=> [A,A,A],[B],[C],[D],[E]
现在,如果我检查hashSet.contains('A')
,它会直接查看包含A
的隔间,这是第一个隔间,并为隔间的每个成员计算A.equals(member-of-compartment)
?
我是对的吗?
答案 0 :(得分:4)
HashMap或HashSet就像带有隔间的抽屉。这些数据结构使用hashCode将对象放在右侧隔间中。
Strings的一个非常简单的hashCode(不是Java使用的,但在现实生活中经常使用的那个)是String的第一个字母。这就是许多人用来将东西放在正确隔间里的东西。
因此,HashMap和HashSet首先会根据hashCode查找正确的隔离专区来搜索对象。一旦他们有了正确的隔间,他们就会从正面到背面透视它以找到合适的物体(但理想情况下,每个隔间中只有很少的物体)
<强> 修改 强>:
你的编辑中的HashSet是正确的。 (如果你实现hashCode函数总是返回相同的值,比如说零,那么它会像“hashSet =&gt; [A,B,C,A,A,D,E]”那样工作 - 它会把所有东西都放到一个桶/隔室)
请注意,HashMap和HashSet在实现方式上差别不大。 HashSet只是一个HashMap,它只使用键并使用一个预定义的值来指示键存在于地图中。
答案 1 :(得分:1)
基于散列的集合具有通常称为 buckets 的内容。具有相同哈希码的所有对象都进入同一个桶。这与打印机的类型案例相同。基于哈希的集合的存储桶就像打印机的类型盒一样。
所有“A”进入同一个隔间,就像所有具有相同哈希码的对象进入同一个存储桶一样。
打印机根据哪个字母决定哪个分区,而不管其类型。这里的“哈希码”操作是类型的字母。
类似地,基于散列的集合需要找到对象所属的存储桶。他们通过获取对象的哈希码来实现此目的。
就像打印机只需要查看“A”隔间以查找所需的特定“A”一样,基于散列的集合调用hashCode()
方法来确定要查找的存储桶对象
打印机仍然需要目视检查隔间中的每个物体,以确定他/她需要什么。同样,即使多个对象位于同一个存储桶中,基于散列的集合仍需要找到正确的对象。基于散列的集合调用equals
以查看对象的密钥是否存在。