根据Javadocs,IdentityHashMap
它说
此类
Map
使用哈希表实现接口,在比较键(和值)时使用引用相等代替对象相等。换句话说,在 a 中IdentityHashMap
,当且仅当 时,两个键 k1 和 k2 被认为相等(k1==k2)
。(在正常Map
实现中(如HashMap
),当且仅当 时,两个键 k1 和 k2 被认为是相等的(k1==null ? k2==null : k1.equals(k2))
。)
据我了解,指向不同内存位置的两个不同对象仍然可以具有相同的哈希码,因此object1.equals(object2)
可以返回true
. 但是指向不同内存位置的两个不同对象永远无法返回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");