Hashing如何为HashSet工作?

时间:2013-06-19 19:28:42

标签: java hash hashmap hashset

我刚刚阅读并理解了散列如何与HashMap一起使用:它如何使用散列表,使用散列函数制作散列码等。

我的问题是:如果相同的原则适用于HashSet?很明显它无法从HashSet的密钥计算哈希码,因为它没有哈希码。但它是否从HashSet的值计算哈希码呢?

3 个答案:

答案 0 :(得分:8)

实际上,HashSetHashMap支持,它将其所有键映射到单个常量对象。此映射的键集充当集合。亲眼看看HashSet source。所以,是的,两者运作的机制非常相似。

答案 1 :(得分:1)

  

我对HashSet的原理是一样的吗?

是的,HashSet使用相同的一般原则:插入到集合中的密钥根据其哈希码排列,使用equals方法解决冲突。

  

显然,它无法从HashSet的密钥计算哈希码,因为它没有一个

当然它有,它可以!实际上,哈希键是HashSet所有的 - 只是键,没有值。

HashMap中,“值”是被动的:存储在密钥中的东西;哈希映射永远不会看到值;特别是,map从不检查值是否相等,或计算其哈希码。您可以将哈希集视为将所有内容映射到null的哈希映射。

答案 2 :(得分:0)

HashSet在内部使用HashMap来存储其对象。每当创建HashSet对象时,也会创建一个与其关联的HashMap对象。该HashMap对象用于存储您在HashSet中输入的元素。您添加到HashSet中的元素存储为此HashMap对象的键。与那些键关联的值将是一个常数。 每当您使用add()方法将元素插入HashSet时,它实际上都会在内部支持的HashMap对象中创建一个条目,并以您指定的元素作为键,并将常量“ PRESENT”作为其值。 HashSet类中定义了以下“ PRESENT”。

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e)
{
        return map.put(e, PRESENT)==null;
}

您会注意到,HashSet类的add()方法通过传递您指定为键的元素和常量“ PRESENT”作为其值,在内部调用支持HashMap对象的put()方法。