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

解决冲突的Hashmap过程

太叔志文
2023-03-14

好的,所以我最近读了很多关于HashMap的文章,我认为有些人让它比实际更令人困惑。我想知道这个过程是否正确。

因此,当您有一个键和值时,例如出生于 1805-02-13 的彼得·狄利克雷,在这种情况下,将是“彼得·狄利克雷”1805-02-13”。

第一步是在Key上使用哈希函数,即“Peter Dirichlet”。让我们假设哈希函数生成这个值到bucket nr<code>5</code>。这意味着在该特定桶中,索引5上,键/值对“Peter Dirichlet”,“1805-02-13”将被存储。

因此,如果我们想检索这些信息,我们使用get("Peter Dirichlet")并且将使用散列函数,将找到索引号并找到Key/Vale-对Peter Dirichlet 1805-02-13。

然后我们有碰撞的情况。假设我们现在有“Leo Euler”出生“1783-09-18”。出于某种原因,我们的哈希函数也将珍贵的Leo放在索引号5中。由于Key-Value与Peter Dirichlet不同,因此不会有替换。

现在,在第五个“桶”中,我们有利奥·欧拉和彼得·狄利克雷。如果我们现在想要检索 Leo,我们使用 get(“Leo Euler”),哈希函数会将我们指向第五个桶。“哎呀,”HashMap说,“这是一次碰撞”。然后我们将遍历这些对象,直到找到“Leo Euler”.equals(“Leo Euler”)。所以它会得到key.equals(key)?因此,对于“Peter Dirichlet”,我们不是这样,而是对于Leo并返回键/值对。

这是对HashMap的正确解释吗?

共有1个答案

吴飞语
2023-03-14

是的,这是正确的解释。.hashcode()(对于Java,等同于其他编程语言)是不够的。可能会发生碰撞。它将遍历存储桶,并针对每个元素将查询(键)与该键值对的键进行比较。当然,从找到正确键的那一刻起,就会返回其相应的值。如果在存储桶中找不到密钥,我们知道它不在哈希图中。

这就是为什么. equals. hashcode相互之间有一个契约:如果a.equals(b),那么a的hashcode必须等于ba.hashcode () == b.hashcode()。请注意,相反的情况并非如此:拥有相同的hashcode并不意味着对象是等价的。

也许关于您的问题的一个小评论是,HashMap 的内部数组不是由键值对组成,而是由键值对的集合组成。在许多情况下,这要么是 LinkedList 要么是 ArrayList。一些实现使用二叉搜索树,尽管通常它往往没有太大回报:毕竟使用一个好的哈希函数应该减少冲突的数量。

 类似资料:
  • 问题内容: Java 使用方法在中插入K / V对。可以说我使用过method,现在有一个条目,其值为10和17。 如果我在其中插入10,20,由于键10相同而发生冲突,它会简单地用该条目替换之前的条目。 如果钥匙碰撞,则用新的K / V对替换旧的K / V对。 所以我的问题是何时使用Chaining冲突解决技术? 为什么它没有形成键值为10且值为17,20的a? 问题答案: 当您插入线对然后时,

  • Java使用方法在中插入K/V对。假设我使用了方法,现在

  • Windows 用tutorial进行的操作 若要进行pull操作,请右击tutorial目录,并选择‘拉取’。 用tutorial进行的操作 在以下画面点击‘确定’。 用tutorial进行的操作 我们看到画面上的警告信息表示自动合并失败。请点击‘关闭’以退出窗口。 用tutorial进行的操作 若您确认变更,请点击‘Yes’。 用tutorial进行的操作 TortoiseGit告诉我们:因"

  • 在上一个页面我们提及到,执行合并即可自动合并Git修改的部分。但是,也存在无法自动合并的情况。 如果远程数据库和本地数据库的同一个地方都发生了修改的情况下,因为无法自动判断要选用哪一个修改,所以就会发生冲突。 Git会在发生冲突的地方修改文件的内容,如下图。所以我们需要手动修正冲突。 ==分割线上方是本地数据库的内容, 下方是远程数据库的编辑内容。 如下图所示,修正所有冲突的地方之后,执行提交。

  • 解决冲突 CVS使用内联“冲突标志”来标记冲突,并且在更新时打印C。历史上讲,这导致了许多问题,因为CVS做得还不够。许多用户在它们快速闪过终端时忘记(或没有看到)C,即使出现了冲突标记,他们也经常忘记,然后提交了带有冲突标记的文件。 Subversion通过让冲突更明显来解决这个问题,它记住一个文件是处于冲突状态,在你运行svn resolved之前不会允许你提交修改,详情见“解决冲突(合并别人

  • 两个客户端同时修改同一个文件, 改动同一个位置,发生冲突情况。 这时如果一个用户使用commit 提交文件就会提示已经过时(out of date): 说明另一个人可能被别人改动过! 这时需要update更新该文件,更新后效果如下:     db.properties 将本地和服务器合并到一起的文件 (不要直接看)     db.properties.mine 我本地自己修改后的文件      d