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

为什么字典键是不可变的?

卫建义
2023-03-14

有一个问题,为什么他们要求在字典中使用不可变对象作为键。

当我最近使用字典(显然不是为了哈希表)将Xml节点对象作为键放置时,这个问题实际上进入了我的脑海。然后,我在使用过程中多次更新节点。

那么,“使用不可变键”到底意味着什么呢?

共有3个答案

曹振
2023-03-14

字典类型是键和值之间的映射。映射将使用密钥的各种属性在内部字典存储中为其分配一个插槽。在大多数情况下,它将属性简化为int值。

如果键随时间变化,那么它的属性可能会开始映射到表中的不同索引。因此,键将不再能够检索它最初映射到表中的值。不可变类型完全避免了这一点,因为它们永远不会改变。因此,它们的映射始终一致

徐鸿文
2023-03-14

字典根据密钥的哈希代码将这些项放入存储桶中。如果您添加了一个项目,然后更改了它的键,您将无法再找到该项目。

如果您使用新的键值来查找它,字典将在另一个bucket中查找,如果您使用旧的键值,字典将在它所在的bucket中查找,但键不再匹配。

何安宜
2023-03-14

将密钥插入哈希表时,哈希表会询问密钥的哈希代码,并将其与密钥本身和关联值一起记住。稍后执行查找时,哈希表会询问要查找的键,以查找其哈希代码,并且可以非常快速地找到表中具有相同哈希代码的所有键。

只要哈希表中的键在它们的整个生命周期中都保持相同的哈希代码,这一切都没问题——但如果它们是可变的(并且在插入哈希表后发生了变异),那么哈希代码通常会发生变化,在这一点上,当您搜索它时将永远找不到条目。

当然,这只适用于影响平等的突变。例如,如果你用一个名字和生日对一个实体进行散列,但由于某种原因,只有名字用于相等(因此在计算散列码时只使用名字),那么你可以将一个作为一个键插入到散列表中,更改其生日,之后仍然可以毫无问题地再次查找。

 类似资料:
  • 问题内容: 为什么字典键必须是不可变的?我正在寻找一个简单明了的原因,为什么Python字典中的键具有该限制。 问题答案: 在我的计算机上,有一个包含大量英语单词的文件: 让我们创建一个字典来存储所有这些单词的长度: 并且,为了踢球,我们将改组原始单词列表: 嗯,滚刀。无论如何…现在我们已经有点混乱了,我们变得有点偏执了(可能出于与渴望滚刀相同的原因),并且我们想检查字典中的所有单词是否都正确。我

  • 问题内容: 我需要实现一个可哈希的字典,因此我可以将一个字典用作另一个字典的键。 但是我从一位同事那里得到了一个通知,说“它并不是真正不变的,因此并不安全。您可以使用它,但是它的确使我感到自己像个可悲的熊猫。 因此,我开始环顾四周以创建一个不可变的对象。我没有必要将“ key-dict”与另一个“ key-dict”进行比较。它的唯一用途是用作另一本词典的键。 我想出了以下几点: 我使用以下工具测

  • 本文向大家介绍String 为什 么是不可变的?相关面试题,主要包含被问及String 为什 么是不可变的?时的应答技巧和注意事项,需要的朋友参考一下 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 Ab

  • 问题内容: 您能否澄清一下,为什么在我们将 final 关键字设为不变时,为什么 在上课之前需要 final 关键字。我的意思是,如果我们将所有属性声明为私有和最终的,那么它也是一个不可变的类,不是吗? 很抱歉,这个问题似乎很简单,但是我对此感到非常困惑。帮帮我。 编辑:我知道一个声明为final的类不能被子类化。但是如果每个属性都是私有和final的,那有什么区别呢? 问题答案: 正如堆纸器所说

  • 我一直在阅读React的快速启动文档; 为什么React道具是只读的?