IdentityHashMap是否会引发冲突?

Arh*_*ham 3 java data-structures

由于每的JavadocIdentityHashMap,它说

此类Map使用哈希表实现接口,在比较键(和值)时使用引用相等性代替对象相等性.换句话说,在a中IdentityHashMap,当且仅当如此时,认为两个键k1和k2相等(k1==k2).(在正常Map 实现中(例如HashMap),当且仅当两个键k1和k2被认为是相等的时(k1==null ? k2==null : k1.equals(k2)).)

据我所知,指向不同内存位置的两个不同对象仍然可以具有相同的哈希码,因此object1.equals(object2)可以返回true.但指向不同的内存位置的两个不同的对象永远不能返回trueobject1 == object2.

问题1 - 当IdentityHashMap严格依赖参考平等时,这是否意味着永远不会发生碰撞?

问题2 - 调试以下代码显示了6个桶,其中key和value都存储在不同的存储桶中.但事实并非如此HashMap,其中密钥和值存储在同一个存储桶中.

因为它的名字中有一个'hash'字样,所以它必须对键进行散列,那么为什么它分别存储键和值以及它如何检索给定键的值?

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");
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

IdentityHashMap不使用hashCode键,但他们的System.identityHashCode.虽然如果你有一个巨大的内存,这种身份哈希码的冲突是可能的,但它们很少.这当然不会阻止两个密钥在同一个桶中结束,因为桶的数量通常远小于2 ^ 32-1.