hashcode和基于散列的集合(即HashMap和HashSet)之间的关系是什么?

时间:2016-01-27 01:01:13

标签: java hash hashmap hashcode hashset

我已阅读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)

我是对的吗?

2 个答案:

答案 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以查看对象的密钥是否存在。