私はハッシュマップを使用しています。
以下はコード例です。
クラス MyKey と MyValue は Object から簡単な方法で継承されます。
Java ドキュメントには、オブジェクトとメソッド hashCode() および equals() について次のように記載されています。
「合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM では必要ありません。プログラミング言語)」
「クラス Object の equals メソッドは、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値 x と y について、このメソッドは、x と y が同じオブジェクトを参照している場合にのみ true を返します (x = = y の値は true です)」
私の質問は:
私の例で HashMap が機能することを信頼できますか? そうでない場合、メソッド hashCode() および equals() を書き換えずに単純なオブジェクトをマップに配置する正しい方法は何でしょうか?
よくわかりませんが、Java はプログラムの実行中にユーザー オブジェクトの場所とアドレスを変更する可能性があると聞きました (それを行う可能性があるのは GC でしたか?)
行の前にkey2のアドレスとハッシュコードが変更された場合
MyValue v = m.get(key2);
m.get(key2) を呼び出すと、間違った値、null が返されますか?
これが本当なら、同じ理由で IdentityHashMap() も役に立たないと思います。
class MyKey
{
Integer v;
//<Perhaps more fields>
MyKey(Integer v) {this.v=v;}
}
class MyValue
{
String s;
//<Perhaps more fields>
MyValue(String s) {this.s = s;}
}
Then some code:
Map<MyKey,MyValue> m = new HashMap<MyKey,MyValue>();
MyKey key1 = new MyKey(5);
MyKey key2 = new MyKey(6);
MyKey key3 = new MyKey(7);
m.put(key1, new MyValue("AAA"));
m.put(key2, new MyValue("BBB"));
m.put(key3, new MyValue("CCC"));
.
.
//Is it sure that I will get value "AAA" here
//if entry with key2 has not been removed from map m?
MyValue v = m.get(key2);
System.out.println("s="+v.s);