繁体   English   中英

散列函数和键

[英]Hashing function and keys

在浏览Kathy Sierra的书时,我偶然发现了这段代码:

m.put("k1", new Dog("aiko"));   // add some key/value pairs
m.put("k2", Pets.DOG);
m.put(Pets.CAT, "CAT key");
Dog d1 = new Dog("clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");

地图用于以密钥和值格式存储内容。 当我们输入“k1”或新的Cat()作为键时,有人会告诉我实际存储在键中的内容吗? 是存储对这些对象的引用还是哈希码的值? 我完全对此感到困惑。 请指教。

如果你能指出我进一步阅读材料,将不胜感激。

地图是N个桶的数组。

put()方法首先在键上调用hashCode() 从这个哈希码中,它使用模数来获取地图中存储桶的索引。

然后,它遍历存储在与找到的存储桶关联的链接列表中的条目,并使用equals()方法将每个条目键与您的密钥进行比较。

如果一个条目的密钥等于您的密钥,则其值将替换为新值。 否则,使用新密钥和新值创建新条目,并将其存储在与存储桶关联的链接列表中。

由于Cat实例和String实例永远不会相等,因此永远不会通过放置与Cat键关联的值来修改与String键关联的值。

它将由您的对象定义。

您必须创建一个hashCode()和一个equals()方法,以便它可以存储在您的哈希表中。

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

请参阅java.lang.Object中的javadoc http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#hashCode ()

或者你可以阅读这个解释http://www.javaworld.com/javaworld/javaqa/2002-06/01-qa-0621-hashtable.html

我希望它有所帮助

将值存储到HashMap取决于hashcode()equals() 。请从此处找到更多引用。

HashMap - hashcode()示例

有关HashMap get()检索值的更多信息。 这里

使用HashMap时,其中的键是唯一的。 在Java中根据所考虑对象的类提供的equals()和hashCode()方法的定义来检查密钥的唯一性。

这是通过首先使用equals()方法进行比较并且如果它返回相等然后使用hashCode()进行比较来完成的。此外,您必须知道指向对象的每个引用都有一个位模式,对于多个引用可能不同同一个对象。

因此,一旦equals()测试通过,对象将不会插入到地图中,因为地图应该具有唯一键。 因此,作为映射中的键的对象的每个hashCode值将为一系列hashCode值形成不同的桶,并且对象将相应地分组。

编辑提供一个例子:

例如,让我们考虑两个对象具有值为“hello”和“hlleo”的String属性,并假设hashCode()函数被编程为使得对象的哈希码是字符的ASCII值的总和。如果String属性的值相等,则String属性和equals()方法返回true。

因此,在上面的情况中,equals()返回false,因为字符串不相等但hashCode将是相同的。 因此,这两个对象将被放置在相同的哈希码桶中。

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM