2

ハッシュ マップとハッシュ テーブルのキー タイプに制約はありますか?----インタビューの質問。はい、必要に応じてカスタマイズできると思います。

4

2 に答える 2

2

技術的には、いいえ。通常、equals() と hashCode() を実装するオブジェクトを使用しますが、厳密には必要ではありません。そうしないと、オブジェクト ID を比較する Object によって定義された基本実装が使用されます。多くの場合、それは適切ではありませんが、場合によっては問題ありません。

技術的には、equals() および hashCode() の実装で使用される値が不変である限り、キーは不変である必要はありません。たとえば、クラス Foo が文字列 "foo" を has の一部として使用している場合、その値 "foo" を変更してはなりません。これは、効率上の理由から、ハッシュ マップが hashCode() 値に基づいてキーをバケットに入れるためです。hashCode が突然変更された場合、ハッシュ マップは認識されず、キーが間違ったバケットに存在するようになり、厄介なバグに遭遇します。それが理にかなっていることを願っています。

于 2013-03-27T01:21:13.357 に答える
1

考慮すべきいくつかの事項:

  1. 「型」だけですが、プリミティブ型は使えません。これは Java の言語制約です。たとえばHashMap<int, Foo>、有効ではありません。使用する必要がありますHashMap<Integer, Foo>

  2. HashMap の動作方法に基づいて、キーには hashCode() と equals() の意味のある実装が必要です。それがどのように「意味がある」かは、必要に応じて異なります。Object のデフォルトの実装ですでにニーズが満たされている可能性がありますが、それを認識する必要があります。

  3. オブジェクト インスタンスがキーとしてマップに配置されると、その hashCode() と equals() の一貫性が保たれます。オブジェクト インスタンスの状態を Key として変更して、hashCode()/equals() が異なる値を返すようにしないでください。もちろん、それを確実にする最も簡単な方法は、不変オブジェクトをキーとして使用することです。ただし、変更可能なオブジェクトを使用しても問題ありませんが、コードでは、キーの状態が変化しないようにします。

于 2013-03-27T01:35:03.030 に答える