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と同じように、なぜこれが違いを生むのかわかりません。
私はかなり混乱しています、そして私は私が非常に明白な何かを見逃しているのではないかと心配しています、そしてそれを見ることができません。もしそうなら、私は恥ずかしいですが、それでも、私はヒントをいただければ幸いです:-)
どうもありがとう!