据我所知,两个不相等的对象可以具有相同的哈希代码。当添加或从HashMap java中检索时,将如何处理这个问题?
HashMap正在研究散列和索引的概念。内部HashMap将值存储在节点数组中。每个节点都表现为LinkedList。
链表的每个节点有4个值:
int hash
HashMap内部结构:
在HashMap中插入值时,会生成密钥的第一个hashcode,并根据某种算法计算索引。
因此,我们的值将与下一个元素的哈希码、键、值和地址一起存储在特定的索引中。
从HashMap中检索值时,首先会生成hashcode,然后生成索引(与插入时的方式相同)。在从索引中获取值时,它首先会检查hashcode,如果hashcode匹配,则只会使用equals方法检查节点中的键。如果键匹配,则只返回值,否则将检查下一个具有相同哈希代码的节点。
在HashMap中,键及其关联值存储在bucket中的链表节点中,键在HashMap中基本上是使用equals()方法而不是hashcode进行比较的。
hm.put("a","aValue"); // Suppose hashcode created for key "a" is 209
hm.put("b","bValue"); // Here hashcode created for key "b" is 209 as well.
a.equals(b)
返回true
,bValue
将替换aValue
并且bValue
将返回。a.equals(b)
返回false
,则会在存储桶列表中创建另一个节点,因此当您调用get("b")
时,您将获得bValue
,因为a.equals(b)
是false
。它们将被添加到同一个存储桶中,equals()
将用于区分它们。每个存储桶可以包含具有相同哈希码的对象列表。
理论上,对于给定类的任何对象,都可以返回与哈希代码相同的整数,但这意味着您失去了哈希映射的所有性能优势,实际上,将对象存储在列表中。
问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一
我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。
问题内容: 我明白为什么为两个相等的(通过)对象提供相同的哈希码很重要。但是反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同还存在吗?我找不到一个可能发生这种情况的示例,因为如果所有使用equals方法的属性都被用来覆盖hashcode方法,那么我们将始终对相等的对象使用相同的hashcode。请评论。 问题答案: 如果两个对象相同,则它们不一定相等。否则,您将发现完美的哈希函数。 但
我有两个哈希要合并。它们看起来像这样: 第二个散列看起来像: 我想合并这两个散列数组,结果如下所示: 有没有一种简单的方法来合并这两个哈希,或者我必须逐个遍历哈希并在另一个哈希中找到该键?
或者他是对的,使用默认的object.hashCode()实现,我们永远不会发生冲突,即两个不同的对象永远不会有相同的hashCode。如果是的话,为什么那么多的java手册没有明确地这么说。 我如何编写一些代码来演示这一点呢?因为通过演示,我还可以证明hashmap中的bucket可以包含不同的hashcode(我试图向他展示hashmap在哪里展开的调试器,但他告诉我这只是逻辑实现,而不是内部
我试图故意制造碰撞。 所以,我有和对象。我已经覆盖了Country的和方法,以便: india.hash代码()==india2.hash代码() 根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果等于key2上的相同操作,那么应该会有冲突。 所以,我放置断点来查看的内容,并查看它的是2。也就是说,它包含两个不同的条目,并且没有link