当前位置 : 主页 > 网络推广 > seo >

如果Key的hashcode相同但equals方法返回false,HashMap如何检索不同的值

来源:互联网 收集:自由互联 发布时间:2021-06-16
我无法理解HashMap的工作模式.请帮助理解它. 假设我们有两个对象Obj1和Obj2具有与1212相同的Hashcode.现在当我们运行“==”并且等于它时返回false. 现在我使用ValueObj1和Valueobj2作为HashMap中的
我无法理解HashMap的工作模式.请帮助理解它.

假设我们有两个对象Obj1和Obj2具有与1212相同的Hashcode.现在当我们运行“==”并且等于它时返回false.

现在我使用ValueObj1和Valueobj2作为HashMap中的值,分别使用Keys Obj1和Obj2.我相信两个值都将保存在与List相同的桶中.

我的问题是HashMap如何为Obj2选择Valueobj2而为Obj1选择ValueObj1.假设有n ..这样的对象和值.
这个键怎么样 – >值关联在内部工作,即使哈希码相同但值不同.

假设两个条件等于未被覆盖和覆盖.

HashMap / HashSet为每个桶实现一个键列表(在Map的情况下与值​​一起).如果多个密钥共享相同的hashCode值,则将它们放在此列表中.

因此,搜索方法首先提取查询键的hashCode,然后迭代相应的列表,直到equals方法成功.在HashSet的情况下,它表示找到密钥,在HashMap的情况下,它返回元组的另一侧:值.

因此,HashMap的内存就像:

+--------+--------+--------+--------+
|   00   |   01   |   10   |   11   |
+--------+--------+--------+--------+
    |        |        |        |
 k00/v00     _     k06/v06     _
    |                 |
 k08/v08           k14/v14
    |                 |
 k04/v04              _
    |
    _

你看到的是四个桶的顶部.每个桶都有一个列表(下面的项目),用于存储密钥(k)和值(v)的元组.由于这里只有四个桶,所以哈希算法使用模4操作,因此具有值v06的密钥k06将被放置在桶06 mod 4 = 02中,因此10.如果第二密钥k14被添加14 mod 4 =因此,如图10所示,它被简单地添加到列表中.

由于值也与它一起存储,因此可以执行快速查找操作.因此,密钥与值一起存储.

您注意到,迭代(链接)列表是一项昂贵的操作.但是HashMap的观点是,人们希望使用正确术语的哈希冲突数(共享同一个桶的密钥数)非常低.通常,人们可能期望每个桶有两个或三个元素.因此,通过在恒定时间内选择正确的桶来实现性能提升,但是搜索桶需要线性时间(或者如果密钥上有完整的排序,则可以实现(平衡的)二叉树以在对数时间内搜索) .然而,最糟糕的情况是,HashMap可以实现与条目的ArrayList / LinkedList相同的性能,但是考虑到散列函数的设计得体,可能性非常低.

网友评论