4

オブジェクトのインスタンス値を使用して、クラス型のオブジェクトをクラス型の他のオブジェクトと比較するために、クラス Object の equals(Object) メソッドをオーバーライドするクラスを作成しました。

オブジェクトのインスタンスをキーとして HashMap に配置し、新しいが同一のオブジェクトをキーとしてマップ上で get(Object) を呼び出すと、null が返されます。

新しい同一のオブジェクトを equals メソッドに渡そうとしましたが、true が返されたので、問題は比較コードではありません。

デバッグを通じて収集したものから、オブジェクトの equals(Object) メソッドが呼び出されることはありません。

ただし、HashMap で String キーを使用し、同じ文字を持つ新しいインスタンスを get(Object) に渡すと、値が正常に返されます。

なぜこうなった?MY equals メソッドに基づいて HashMap テスト キーを取得するにはどうすればよいですか?

4

2 に答える 2

11

もオーバーライドする必要がありますObject.hashcode()。リンクを参照hashcode()してequals()ください.HashTableHashMapHashSet

ではHashMap、値はキーのハッシュコードによって到達されるバケットに格納されます。適切なバケットが見つかると、等しいかどうかが判断されるまで、バケットの各メンバーに equals メソッドが適用されます。このため、ハッシュ アルゴリズムが「適切にハッシュされる」ことを確認することが重要です。

于 2012-06-06T18:27:30.433 に答える
1

また、hashCode をオーバーライドする必要があります。そうしないと、HashMap (名前が示すように) がハッシュのコレクションに基づいて等価と見なされるため、機能しません。equals をオーバーライドするための Java の「名誉コード」は、同時に hashCode もオーバーライドする必要があるということです。

于 2012-06-06T18:28:50.923 に答える