ハッシュ マップとハッシュ テーブルのキー タイプに制約はありますか?----インタビューの質問。はい、必要に応じてカスタマイズできると思います。
2 に答える
技術的には、いいえ。通常、equals() と hashCode() を実装するオブジェクトを使用しますが、厳密には必要ではありません。そうしないと、オブジェクト ID を比較する Object によって定義された基本実装が使用されます。多くの場合、それは適切ではありませんが、場合によっては問題ありません。
技術的には、equals() および hashCode() の実装で使用される値が不変である限り、キーは不変である必要はありません。たとえば、クラス Foo が文字列 "foo" を has の一部として使用している場合、その値 "foo" を変更してはなりません。これは、効率上の理由から、ハッシュ マップが hashCode() 値に基づいてキーをバケットに入れるためです。hashCode が突然変更された場合、ハッシュ マップは認識されず、キーが間違ったバケットに存在するようになり、厄介なバグに遭遇します。それが理にかなっていることを願っています。
考慮すべきいくつかの事項:
「型」だけですが、プリミティブ型は使えません。これは Java の言語制約です。たとえば
HashMap<int, Foo>
、有効ではありません。使用する必要がありますHashMap<Integer, Foo>
HashMap の動作方法に基づいて、キーには hashCode() と equals() の意味のある実装が必要です。それがどのように「意味がある」かは、必要に応じて異なります。Object のデフォルトの実装ですでにニーズが満たされている可能性がありますが、それを認識する必要があります。
オブジェクト インスタンスがキーとしてマップに配置されると、その hashCode() と equals() の一貫性が保たれます。オブジェクト インスタンスの状態を Key として変更して、hashCode()/equals() が異なる値を返すようにしないでください。もちろん、それを確実にする最も簡単な方法は、不変オブジェクトをキーとして使用することです。ただし、変更可能なオブジェクトを使用しても問題ありませんが、コードでは、キーの状態が変化しないようにします。