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

时间:2013-03-15 17:57:04

标签: c# dictionary key immutability

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

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

那么'使用不可变密钥'真的是什么意思?

3 个答案:

答案 0 :(得分:12)

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

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

当然,这仅适用于影响平等的突变。例如,如果您使用名称和生日来散列Person实体,但由于某种原因,只使用该名称进行相等(因此在计算哈希代码时仅使用该名称),那么您可以插入{ {1}}作为键进入哈希表,更改其生日,并且以后仍可以再次查找,没有任何问题。

答案 1 :(得分:3)

字典根据密钥的哈希码将项目放在存储桶中。如果您添加项目然后更改其密钥,则无法再找到该项目。

如果使用新的键值来查找它,字典将查找不同的存储桶,如果使用旧的键值,字典将找到存储桶的位置,但键不再匹配。< / p>

答案 2 :(得分:1)

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

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

相关问题