调用谁的 .equals() 方法来解决 HashMap 中的哈希冲突?
Whose .equals() method is called to resolve hash collision in HashMaps?
关于 HashMaps 哈希冲突的每一篇文章都有一个共同点,我的问题围绕着这个。
让我解释一下我对 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) 新找到的哈希值被映射到桶的内部索引,现在有一个问题,因为它已经在这个桶位置有一个条目。
解决方案:由于Entry实际上是一个简单的链表,因此具有冲突哈希的新项目存储在前一个Entry的下一个。
使用 map.get(k)
获取条目 e2
1) 从密钥生成散列,并使用从密钥获取的散列作为种子再次调用静态散列方法。
2) 使用静态散列方法得到的散列值找到映射的桶,现在如果有多个条目这里equals() 方法来拯救。
即链表将遍历并继续调用 "equals()" 方法,直到找到匹配项。
现在我的问题是这个所谓的 equals() 方法在哪里定义?
我打开了HashMap的官方文档,它并没有覆盖.equals()方法,那么它覆盖在哪里呢?还是对象 class 中的默认 .equals() ?
hashCode()
和equals()
方法都属于key对象的class,不属于hash map
这些方法在 Object
class 中定义,但希望在哈希映射中用作键的对象为这两种方法提供自己的实现。因此,它不是来自 Object
class 的 default .equals()
,而是 specific .equals()
来自为解决冲突而调用的实际键 class。
例如,如果您使用 String
对象作为键,将使用 String
提供的 hashCode()
和 equals()
的覆盖。
关于 HashMaps 哈希冲突的每一篇文章都有一个共同点,我的问题围绕着这个。
让我解释一下我对 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) 新找到的哈希值被映射到桶的内部索引,现在有一个问题,因为它已经在这个桶位置有一个条目。
解决方案:由于Entry实际上是一个简单的链表,因此具有冲突哈希的新项目存储在前一个Entry的下一个。
使用 map.get(k)
获取条目 e21) 从密钥生成散列,并使用从密钥获取的散列作为种子再次调用静态散列方法。
2) 使用静态散列方法得到的散列值找到映射的桶,现在如果有多个条目这里equals() 方法来拯救。
即链表将遍历并继续调用 "equals()" 方法,直到找到匹配项。
现在我的问题是这个所谓的 equals() 方法在哪里定义?
我打开了HashMap的官方文档,它并没有覆盖.equals()方法,那么它覆盖在哪里呢?还是对象 class 中的默认 .equals() ?
hashCode()
和equals()
方法都属于key对象的class,不属于hash map
这些方法在 Object
class 中定义,但希望在哈希映射中用作键的对象为这两种方法提供自己的实现。因此,它不是来自 Object
class 的 default .equals()
,而是 specific .equals()
来自为解决冲突而调用的实际键 class。
例如,如果您使用 String
对象作为键,将使用 String
提供的 hashCode()
和 equals()
的覆盖。