JavaHashMap如何使用相同的哈希代码处理不同的对象?

JavaHashMap如何使用相同的哈希代码处理不同的对象?

根据我的理解,我认为:

  1. 两个对象具有相同的哈希代码是完全合法的。
  2. 如果两个对象相等(使用equals()方法),那么它们具有相同的哈希代码。
  3. 如果两个对象不相等,则它们不能具有相同的哈希码。

我说对了吗?

如果是正确的,我有以下问题:HashMap内部使用对象的哈希代码。因此,如果两个对象可以具有相同的哈希代码,那么HashMap跟踪它使用哪个键?

有人能解释一下HashMap在内部使用对象的哈希代码?


素胚勾勒不出你
浏览 431回答 3
3回答

慕村9548890

hashmap的工作方式如下(这稍微简化了一点,但它说明了基本机制):它有许多用来存储键值对的“桶”。每个桶都有一个唯一的编号-这就是桶的标识。当您将键值对放入映射中时,哈希映射将查看密钥的哈希代码,并将其存储在标识符是密钥的哈希代码的桶中。例如:密钥的哈希代码是235->该对存储在桶号235中。(请注意,一个桶可以存储多个键值对)。当您在hashmap中查找一个值时,通过给它一个键,它将首先查看您提供的密钥的哈希代码。然后,hashmap将查看相应的桶,然后将您给出的键与桶中所有对的键进行比较,方法是将它们与equals().现在,您可以看到这对于在映射中查找键值对是多么有效:通过键的哈希代码,hashmap立即知道要在哪个桶中查看,因此它只需要测试该桶中的内容。查看上面的机制,您还可以看到在hashCode()和equals()钥匙的方法:如果两个键是相同的(equals()回报true(当你比较他们时,他们hashCode()方法必须返回相同的数字。如果键违反了这一点,那么相等的键可能存储在不同的桶中,并且hashmap将无法找到键值对(因为它将在同一个桶中查找)。如果两个键是不同的,那么它们的哈希代码是否相同并不重要。如果它们的哈希代码相同,它们将存储在同一个桶中,在本例中,hashmap将使用equals()把他们区分开来。

梵蒂冈之花

你的第三个说法是不正确的。两个不平等对象具有相同的哈希代码是完全合法的。它被HashMap作为一个“第一次通过的过滤器”,这样地图就可以快速地找到可能具有指定键的条目。然后测试具有相同哈希码的密钥是否与指定的键相等。您不希望要求两个不平等的对象不能具有相同的哈希代码,否则将限制为2。32可能的物体。(这也意味着不同类型甚至不能使用对象的字段来生成哈希代码,因为其他类可以生成相同的哈希。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java