0

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

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

4

4 回答 4

2

该映射是一个由 N 个桶组成的数组。

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

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

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

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

于 2012-04-17T10:41:05.773 回答
0

它将由您的对象定义。

您必须创建一个 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

我希望它有帮助

于 2012-04-17T10:31:05.117 回答
0

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

HashMap - hashcode() 示例

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

于 2012-04-17T10:33:43.760 回答
0

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

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

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

编辑提供一个例子:

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

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

希望有帮助。

于 2012-04-17T11:05:01.457 回答