我刚刚阅读并理解了哈希如何与 HashMap 一起工作:它如何使用哈希表,如何使用哈希函数制作哈希码等。
我的问题是:如果相同的原则适用于 HashSet?很明显它不能从 HashSet 的键中计算出哈希码,因为它没有。但是它会根据 HashSet 的值计算哈希码吗?
实际上, aHashSet
由HashMap
将其所有键映射到单个常量对象的支持。此映射的键集充当集合。通过查看HashSet
源代码自己了解。所以是的,两者的运作机制非常相似。
HashSet 在内部使用 HashMap 来存储它的对象。每当您创建一个 HashSet 对象时,也会创建一个与之关联的 HashMap 对象。此 HashMap 对象用于存储您在 HashSet 中输入的元素。您添加到 HashSet 中的元素存储为此 HashMap 对象的键。与这些键关联的值将是一个常量。每当您使用 add() 方法将元素插入 HashSet 时,它实际上会在内部支持 HashMap 对象中创建一个条目,其中您指定的元素作为它的键和称为“PRESENT”的常量作为它的值。这个“PRESENT”在 HashSet 类中定义如下。
// 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() 方法在内部调用支持 HashMap 对象的 put() 方法,方法是将您指定为键的元素和常量“PRESENT”作为其值传递。
Iс HashSet 的原理相同吗?
是的,HashSet
使用完全相同的一般原则:插入集合中的键根据它们的哈希码排列,使用equals
解决冲突的方法。
显然,它不能从
HashSet
的键计算哈希码,因为它没有
当然有,而且可以!事实上,哈希键就是所有的HashSet
——只有键,没有值。
在aHashMap
中,“价值”是被动的:那是存储在键中的东西;哈希映射从不查看值;特别是,map 从不检查值是否相等,或计算它们的哈希码。您可以将哈希集视为将所有内容映射到null
.