根据IdentityHashMapJavadocs,它说

该类使用哈希表实现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/

10-08 23:03