当前位置: 首页 > 知识库问答 >
问题:

当不同的键具有相同的哈希代码时,为什么哈希映射中没有冲突

谭琛
2023-03-14

我试图故意制造碰撞。

 fun main(args: Array<String>) {
   val india = Country("India1", 1000)
   val india2 = Country("India2", 1000)

   val countryCapitalMap: HashMap<Country, String> = hashMapOf()
   countryCapitalMap.put(india, "Delhi1")
   countryCapitalMap.put(india2, "Delhi2")
 }


class Country(var name: String, var population: Long) {

  override fun hashCode(): Int {
      return if (name.length % 2 == 0) 31 else 95
  }

  override fun equals(obj: Any?): Boolean {
      val other = obj as Country?
      return if (name.equals(other!!.name, ignoreCase = true)) true else false
  }
}

所以,我有indiaindia2对象。我已经覆盖了Country的equals()hashCode()方法,以便:

    india.hash代码()==india2.hash代码()

根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果hash(key.hashCode())等于key2上的相同操作,那么应该会有冲突。

所以,我放置断点来查看countryCapitalMap的内容,并查看它的size是2。也就是说,它包含两个不同的条目,并且没有linkedList。因此,没有碰撞。

我的问题是:

为什么Country Capital alMap的大小为2?为什么没有碰撞?

为什么HashMap不创建一个LinkedList,其中包含两个键相等但哈希代码相同的条目?

共有1个答案

凌通
2023-03-14

当键的哈希相同时,您将冲突情况与重复键(即根据equals()方法相同的键)混淆。这是两种完全不同的情况。

在引擎盖下,HashMap维护一组桶。每个bucket对应一系列散列值。

如果键的散列冲突(但键不相等),条目(Nodes)将映射到同一个bucket并形成一个链表,在达到某个阈值后,链表将变成一棵树。

相反,如果试图添加一个新条目,而该条目的密钥已经存在于映射中(即重复密钥),则会导致更新现有条目的值。

因为正如您已经观察到的,india.equals(India2)将返回falseHashMap将包含两个条目。

由于indiaindia2的散列是相同的,因此您成功地实现了创建冲突的意图。两个条目都将被添加,都将在同一个bucket中结束(即,它们的节点将形成一个链表)。

 类似资料:
  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 我可以有一个哈希图在Java看起来像这样吗? 我的问题和这里的类似问题 我是Java新手。所以我想知道的是,如果我需要上面这样的东西,如果它无效,什么是最好的数据结构?

  • 本文向大家介绍Java中并发哈希映射和同步哈希映射之间的区别,包括了Java中并发哈希映射和同步哈希映射之间的区别的使用技巧和注意事项,需要的朋友参考一下 并发Hashmap是jdk1.5中引入的类。并发哈希映射仅在添加或更新映射时在称为片段的存储桶级别应用锁。因此,并发哈希映射允许对映射进行并发读写操作。  同步hashmap(Collection.syncronizedHashMap())是C

  • 我有两个哈希要合并。它们看起来像这样: 第二个散列看起来像: 我想合并这两个散列数组,结果如下所示: 有没有一种简单的方法来合并这两个哈希,或者我必须逐个遍历哈希并在另一个哈希中找到该键?