我刚刚阅读并理解了散列如何与HashMap一起使用:它如何使用散列表,使用散列函数制作散列码等。
我的问题是:如果相同的原则适用于HashSet?很明显它无法从HashSet的密钥计算哈希码,因为它没有哈希码。但它是否从HashSet的值计算哈希码呢?
答案 0 :(得分:8)
实际上,HashSet
由HashMap
支持,它将其所有键映射到单个常量对象。此映射的键集充当集合。亲眼看看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()方法。