ディクショナリのキーとして不変オブジェクトを使用するように要求する理由について質問があります。
Xml ノード オブジェクトをキーとして配置するために最近辞書を使用したとき (明らかにハッシュ テーブルの目的ではありません)、この疑問が実際に頭に浮かびました。その後、使用中にノードを数回更新しました。
では、「不変のキーを使用する」とは実際には何を意味するのでしょうか?
ディクショナリのキーとして不変オブジェクトを使用するように要求する理由について質問があります。
Xml ノード オブジェクトをキーとして配置するために最近辞書を使用したとき (明らかにハッシュ テーブルの目的ではありません)、この疑問が実際に頭に浮かびました。その後、使用中にノードを数回更新しました。
では、「不変のキーを使用する」とは実際には何を意味するのでしょうか?
キーをハッシュテーブルに挿入すると、ハッシュテーブルはキーにハッシュコードを要求し、キー自体および関連する値とともにキーを記憶します。後でルックアップを実行すると、ハッシュテーブルは探しているキーにハッシュコードを要求し、同じハッシュコードを持つテーブル内のすべてのキーを非常にすばやく見つけることができます。
ハッシュテーブル内のキーがその存続期間を通じて同じハッシュコードを保持している限り、これはすべて問題ありませんが、それらが変更可能である場合(およびハッシュテーブルに挿入された後に変更される場合)、通常、ハッシュコードは変更されます。エントリを検索しても、そのエントリは見つかりません。
もちろん、これは平等に影響を与える突然変異にのみ適用されます。たとえばPerson
、名前と誕生日を使用してエンティティをハッシュするが、何らかの理由で名前のみが同等性のために使用される場合(したがって、ハッシュコードの計算時に名前のみが使用される場合)、をPerson
ハッシュテーブルに次のように挿入できます。キーを押して誕生日を変更しても、後で問題なく再検索できます。
ディクショナリは、キーのハッシュ コードに基づいてアイテムをバケットに配置します。アイテムを追加してからそのキーを変更すると、アイテムが見つからなくなります。
新しいキー値を使用して検索すると、ディクショナリは別のバケットを検索します。古いキー値を使用すると、ディクショナリはバケットがある場所を見つけますが、キーは一致しなくなります。
ディクショナリタイプは、キーと値の間のマッピングです。マッピングでは、キーのさまざまなプロパティを使用して、内部ディクショナリストレージのスロットを割り当てます。ほとんどの場合、単純にプロパティをint
値に減らします。
キーが時間の経過とともに変化する場合、そのプロパティはテーブル内の別のインデックスにマップされ始める可能性があります。したがって、キーは、テーブルで最初にマップされた値を取得できなくなります。不変型は変更できないため、これを完全に回避します。したがって、それらのマッピングは常に一貫しています