のJavadocにIdentityHashMapよると、
このクラスは、
Mapキー(および値)を比較するときにオブジェクトの同等性の代わりに参照の同等性を使用して、ハッシュテーブルを使用してインターフェイスを実装します。言い換えると、でIdentityHashMap、2つのキーk1とk2は、がである場合にのみ等しいと見なされ(k1==k2)ます。(通常のMap実装(のようなHashMap)では、2つのキーk1とk2は、次の場合にのみ等しいと見なされ(k1==null ? k2==null : k1.equals(k2))ます。)
私が理解しているように、異なるメモリ位置を指す2つの異なるオブジェクトは、同じハッシュコードを持つことができるため、object1.equals(object2)を返すことができtrueます。ただし、異なるメモリ位置を指す2つの異なるオブジェクトは、に戻ることはできませtrueんobject1 == object2。
質問1-IdentityHashMap参照の同等性に厳密に依存している場合、それは衝突が発生しないことを意味しますか?
質問2-次のコードをデバッグすると、キーと値の両方が別々のバケットに格納されている、全部で6つのバケットが表示されます。ただし、これはHashMap、キーと値が同じバケットに格納されている場合には当てはまりません。
名前には「ハッシュ」という単語が含まれているため、キーをハッシュする必要があります。それでは、なぜキーと値を別々に格納し、特定のキーの値を取得するのでしょうか。
String A = "abc";
String B = "def";
String C = new String("abc");
Map<String, String> map1 = new IdentityHashMap<String, String>();
map1.put(A, "123");
map1.put(B, "345");
map1.put(C, "567");