关于HashMaps哈希冲突的每一篇文章都有一个共同点,我的问题围绕着这个问题。
让我解释一下我对哈希映射内部工作的理解。
使用map.put(k,v)保存两个具有相同哈希码的条目(e1,e2)
1)当调用map.put(k,v)时,hashmap找到键'k'的hashCode()。
2)然后它使用它作为其内部静态哈希方法的种子发现的这个哈希码&得到另一个哈希值。
3)然后将这个新发现的哈希值映射到桶的内部索引。
4)然后将一个条目添加到存储桶中。
如果发生哈希冲突。
1)与正常情况相同,当调用map.put(k,v)时,hashmap会找到键'k'的hashCode()。
2)再次与通常相同,然后它使用它作为其内部静态哈希方法的种子找到的这个哈希码&得到另一个哈希值。
3)新发现的哈希值被映射到桶的内部索引,现在存在问题,因为它已经在该桶位置有一个条目。
解决方案:由于条目实际上是一个简单的链接列表,因此带有冲突哈希的新项目将存储在上一个条目的下一个条目中。
使用map.get(k)
获取条目e21)密钥和密钥生成的哈希再次使用哈希从密钥中获取的静态哈希方法作为种子。
2)使用静态哈希方法获得的哈希值找到映射的桶,现在如果这里有多个条目, equals()方法就可以解决了。
链接列表将遍历&继续调用“equals()”方法,直到找到匹配为止。
现在我的问题是这个所谓的equals()方法定义在哪里?
我打开了HashMap的官方文档。它不会覆盖.equals()方法,那么它在哪里覆盖?或者它是Object类的默认.equals()吗?
答案 0 :(得分:3)
hashCode()
和equals()
方法都属于密钥对象的类,而不属于哈希映射。
这些方法在Object
类中定义,但是在哈希映射中用作键的对象应该为这两种方法提供自己的实现。因此,它不是来自.equals()
类的默认 Object
,而是来自实际密钥的特定 .equals()
被调用以进行冲突解决的类。
例如,如果您使用String
个对象作为键,则会使用hashCode()
提供的equals()
和String
的覆盖。