Java 调用谁的.equals()方法来解决HashMaps中的哈希冲突?
关于HashMaps哈希冲突的每一篇文章都有一个共同点,我的问题就是围绕这个问题。 让我解释一下我对hashmaps内部工作的理解 使用map.put(k,v)保存具有相同哈希代码的两个条目(e1,e2) 1) 调用map.put(k,v)时,hashmap会找到键“k”的hashCode() 2) 然后,它使用找到的哈希代码作为其内部静态哈希方法的种子&获取另一个哈希值 3) 然后,这个新发现的散列值被映射到bucket的内部索引 4) 然后将一个条目添加到存储桶中 以防散列冲突。 1) 与正常情况相同,当调用map.put(k,v)时,hashmap会找到键“k”的hashCode() 2) 和往常一样,它使用找到的哈希代码作为内部静态哈希方法的种子&获取另一个哈希值 3) 新找到的散列值映射到bucket的内部索引,现在有一个问题,因为它在这个bucket位置已经有了一个条目 解析:由于条目实际上是一个简单的链表,因此具有冲突哈希的新条目存储在前一条条目的下一条 使用map.get(k)获取条目e2 1) 从key生成hash&再次使用从key获取的hash作为种子调用静态hash方法 2) 使用静态散列方法获得的散列值查找映射的bucket,现在如果这里有多个条目,equals()方法可以解决问题。 也就是说,链表将遍历并继续调用“equals()”方法,直到找到匹配项为止 现在我的问题是,这个所谓的equals()方法是在哪里定义的 我打开了HashMap的官方文档&它没有覆盖.equals()方法,那么在哪里被覆盖呢?或者它是对象类中的默认.equals()。这两个Java 调用谁的.equals()方法来解决HashMaps中的哈希冲突?,java,data-structures,hashmap,equals,Java,Data Structures,Hashmap,Equals,关于HashMaps哈希冲突的每一篇文章都有一个共同点,我的问题就是围绕这个问题。 让我解释一下我对hashmaps内部工作的理解 使用map.put(k,v)保存具有相同哈希代码的两个条目(e1,e2) 1) 调用map.put(k,v)时,hashmap会找到键“k”的hashCode() 2) 然后,它使用找到的哈希代码作为其内部静态哈希方法的种子&获取另一个哈希值 3) 然后,这个新发现的散列值被映射到bucket的内部索引 4) 然后将一个条目添加到存储桶中 以防散列冲突。 1) 与正
hashCode()
和equals()
方法都属于键对象的类,而不是哈希映射
这些方法是在Object
类中定义的,但是在散列映射中用作键的对象应该为这两种方法提供它们自己的实现。因此,它不是来自对象类的默认.equals()
,而是来自实际密钥类的特定.equals()
,用于冲突解决
例如,如果使用String
对象作为键,则将使用String
提供的对hashCode()
和equals()
的覆盖。等待什么HashMap
不调用它自己的equals方法,这没有意义,它调用您试图插入的objects equals方法。@tkausl您能详细解释一下吗?你的意思是说使用对象类的equal()中的默认“==”来查找键吗?因此,默认情况下,如果我没有在键中指定equals(),将使用键类的引用?这给我带来了另一个问题,如果我添加两个具有相同值但引用不同的键对象会怎么样?EX-String key1=“权力游戏”;弦键2=新弦(“权力游戏”);它将如何影响查找?@SujalMandal您描述的情况正好说明了使用equals
代替=
的原因。您有两个不同的对象引用,它们的值彼此相等,因此==
返回false
但key1。equals(key2)
返回true
@SujalMandal从对象继承的默认equals()
仅在比较两个相同实例时返回true,而不考虑值<但是,code>String
确实实现了equals()
,因此您的两个字符串键将被视为相等,因此是同一个键。通常建议所有对象覆盖equals()
和hashcode()
,尤其是当您将它们用作映射中的键时。@puhlen我通常忽略这一点,直到现在,但现在我保证在我的余生之前,我将覆盖key类中的equals()&hashcode():3