3

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

我的问题是:如果相同的原则适用于 HashSet?很明显它不能从 HashSet 的键中计算出哈希码,因为它没有。但是它会根据 HashSet 的值计算哈希码吗?

4

3 回答 3

8

实际上, aHashSetHashMap将其所有键映射到单个常量对象的支持。此映射的键集充当集合。通过查看HashSet源代码自己了解。所以是的,两者的运作机制非常相似。

于 2013-06-19T19:31:17.153 回答
2

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”作为其值传递。

于 2020-07-04T13:55:11.737 回答
1

Iс HashSet 的原理相同吗?

是的,HashSet使用完全相同的一般原则:插入集合中的键根据它们的哈希码排列,使用equals解决冲突的方法。

显然,它不能从HashSet的键计算哈希码,因为它没有

当然有,而且可以!事实上,哈希键就是所有的HashSet——只有键,没有值。

在aHashMap中,“价值”是被动的:那是存储在键中的东西;哈希映射从不查看值;特别是,map 从不检查值是否相等,或计算它们的哈希码。您可以将哈希集视为将所有内容映射到null.

于 2013-06-19T19:30:57.047 回答