On every single article about HashMaps hash collision one thing is in common and my question revolves around that.
让我解释一下我对哈希映射内部工作的理解 .
Saving two entries(e1,e2) with same hashcode using map.put(k,v)
1)当调用map.put(k,v)时,hashmap找到键'k'的hashCode() .
2)然后它使用它作为其内部静态哈希方法的种子找到的哈希码并获得另一个哈希值 .
3)然后将这个新发现的哈希值映射到桶的内部索引 .
4)然后将一个条目添加到桶中 .
In case of a hash collision.
1)与正常情况相同,当调用map.put(k,v)时,hashmap找到键'k'的hashCode() .
2)再次像往常一样,然后它使用它作为其内部静态哈希方法的种子找到的哈希码并获得另一个哈希值 .
3)新发现的哈希值被映射到桶的内部索引,现在存在问题,因为它已经在该桶位置具有条目 .
Resolution : 因为Entry实际上是一个简单的链表,所以带有冲突哈希的新项目存储在前一个Entry的下一个 .
Fetching the entry e2 with map.get(k)
1)从密钥和再次静态哈希方法生成的哈希,使用从密钥获得的哈希作为种子来调用 .
2)使用静态哈希方法获得的哈希值查找映射的桶,现在如果这里有多个条目 equals() method comes to the rescue.
也就是说,链表会遍历并继续调用“equals()”方法,直到找到匹配为止 .
现在我的问题是这个所谓的equals()方法定义在哪里?
我打开了HashMap的官方文档,它没有覆盖.equals()方法, so where is it overriden? Or is it the default .equals() from the Object class ?
1 回答
hashCode()
和equals()
方法都属于键对象的类,而不属于哈希映射 .这些方法在
Object
类中定义,但是期望在哈希映射中用作键的对象为这两种方法提供它们自己的实现 . 因此,它不是来自Object
类的默认.equals()
,它是来自实际键类的特定.equals()
,它被调用以进行冲突解决 .例如,如果使用
String
对象作为键,则将使用String
提供的hashCode()
和equals()
的覆盖 .