散列函数和键

时间:2012-04-17 10:18:26

标签: java hashtable

在浏览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()作为键时,有人会告诉我实际存储在键中的内容吗?是存储对这些对象的引用还是哈希码的值?我完全对此感到困惑。请指教。

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

4 个答案:

答案 0 :(得分:2)

地图是N个桶的数组。

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

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

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

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

答案 1 :(得分:0)

它将由您的对象定义。

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

  

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

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

中的javadoc

或者您可以阅读此内容以获得解释 http://www.javaworld.com/javaworld/javaqa/2002-06/01-qa-0621-hashtable.html

我希望它有所帮助

答案 2 :(得分:0)

将值存储到HashMap取决于hashcode()equals()方法。请从此处找到更多参考。

HashMap - hashcode() Example

有关HashMap get()值检索的详细信息。Here

答案 3 :(得分:0)

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

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

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

编辑提供示例:

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

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

希望有所帮助。