0

さて、私はカスタムユーザー定義オブジェクトを私のHashMap代わりにキーとして使用したいと思いますString。候補オブジェクトは不変である必要がありますか?ベストプラクティスはそれらを不変にすることであるとどこかで読みましたが、その理由を自分で理解することはできません。

4

3 に答える 3

6

HashMap に変更可能なキーがある場合、それは間違ったバケットに入り、Map が完全に壊れます。

  1. キーの挿入、hashCode() の呼び出し、バケットの割り当て
  2. キーの変更、hashCode の変更、バケットと一致しなくなった
  3. (新しい) キーによるルックアップ、hashCode() が間違ったバケットにつながる、値が見つからない
  4. (古い)キーで検索すると、hashCode()は「正しい」バケットにつながりますが、見つかったキーはもうありませんequal(現在は「新しい」キーであるため)。したがって、それも破棄されます

TreeMap に変更可能なキーがある場合、ソートされるはずのツリーの間違った位置に配置されます (これは挿入時に発生します)。基本的に上記の流れと同じです。

そして、私たちはここで直喩を好むので、これは、まったく新しい本を印刷せずに、既存の電話帳の名前をマジック マーカーで変更するようなものです: したがって、新しい名前「Smith」は、「John」と「Johnston」の間にリストされます (ここで、誰もそれを探しません)、そして「スマート」と「スミザーズ」(彼らが探している場所)の間で誰もそれを見つけません。TreeMap は、電話帳のように機能します。

于 2012-08-22T06:37:17.933 に答える
5

はい、変更できた場合、キーとしてはうまく機能しないため、不変である必要があります。家の鍵と鍵を購入することを想像してみてください。しかし、鍵を別の形にハンマーで叩いて、よりきれいにしたいと思います。うまくいきませんね。ここでも同じ原則が適用されます。

于 2012-08-22T06:34:29.337 に答える
0

はい。別の場所からキーを更新すると、そのキーに保存されている値を検索できなくなります。

于 2012-08-22T06:38:32.457 に答える