根据IdentityHashMap
的Javadocs,它说
该类使用哈希表实现Map
接口
比较键时使用引用相等代替对象相等
(和值)。换句话说,在IdentityHashMap
中,两个键k1和
当且仅当(k1==k2)
时,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");
最佳答案
当两个不同的项目具有相同的哈希码时,就会发生冲突,因此很明显IdentityHashMap
必须处理冲突。唯一的区别是“常规”哈希图使用equals
(对于不同的对象可以是true
),而IdentityHashMap
使用的==
(对于不同的对象则不能是true
)。
“常规”哈希映射将键和值的变量分开的原因是IdentityHashMap
的实现细节:其实现使用linear probing来解决冲突,并且还将键和值存储在同一表中:键位于table[hash]
,而值放在table[hash+1]
。常规HashMap
定义了一个Entry
类,该类将键及其键值组合到同一对象中,并将条目存储在存储桶中。
关于java - IdentityHashMap是否会发生冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12779113/