0

ContextクラスのオブジェクトをIntegersにマッピングするHashMapがあります。Contextクラスでは、java.lang.Objectのpublic int hashCode()とpublic boolean equals(Object c)をオーバーライドしました。しかし、私はそれを繰り返すのに問題があります:

(たとえば)各Contextオブジェクトに割り当てられた整数値を取得したいので、マップのキーセットを反復処理します。ただし、マップには指定されたキーがないと表示されているため、機能しません。

for (Context to : map.keySet()) {
    System.out.println("to-hash: " + to.hashCode());
    System.out.println("first-hash: " + map.keySet().iterator().next().hashCode());
    System.out.println("hashs equal: " + (to.hashCode()==map.keySet().iterator().next().hashCode()));
    System.out.println("to equals first: " + to.equals(map.keySet().iterator().next()));
    System.out.println("map has to? " + map.containsKey(to));
}

出力は

to-hash: 156349
first-hash: 156349
hashs equal: true
to equals first: true
map has to? false

私が理解していることは、キーが与えられると、マップは最初にハッシュコードが一致するかどうかをチェックし、次に等しいかどうかをチェックするということです。ここでは両方の場合があり、「to」オブジェクトとキーセットの最初のオブジェクトのハッシュコードが一致し、それらも等しくなります。興味深いことに、hashCode()関数の戻り値を定数に変更すると(これは有効ですが、パフォーマンス上の理由から推奨されません)、機能します。しかし、156349==156349は7==7と同じように、なぜこれが違いを生むのかわかりません。

私はかなり混乱しています、そして私は私が非常に明白な何かを見逃しているのではないかと心配しています、そしてそれを見ることができません。もしそうなら、私は恥ずかしいですが、それでも、私はヒントをいただければ幸いです:-)

どうもありがとう!

4

1 に答える 1

9

これは、Contextオブジェクトがハッシュコードに影響を与える方法で変更可能であり、マップに配置した後にハッシュコードを変更する操作を実行した場合に発生する可能性があります。hashCode() マップは挿入点での値のみを記録し、特定のキーを検索しようとしたときに一致するものを見つけるためにそれを使用します。

これは、ハッシュ関数を定数にすると機能することと一致します。基本的に、マップに配置した後にハッシュキーを変更しないでください。

もちろん、これは単なる推測ですが、症状に適合します。

于 2011-08-29T20:34:18.043 に答える