gpt4 book ai didi

java - IdentityHashMap 是否接受碰撞?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:58:39 24 4
gpt4 key购买 nike

根据 Javadocs IdentityHashMap,它说

This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)

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

问题 1 - 当 IdentityHashMap 严格依赖引用相等性时,这是否意味着永远不会发生冲突?

问题 2 - 调试以下代码向我展示了总共 6 个桶,键和值都存储在不同的桶中。但是 HashMap 就不是这样了,key 和 value 存储在同一个 bucket 中。

因为它的名称中有一个'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");

最佳答案

IdentityHashMap 不使用键的 hashCode,而是使用它们的 System.identityHashCode。虽然如果您有大量内存,这种身份哈希码可能会发生冲突,但这种情况很少见。这当然不会阻止两个 key 最终出现在同一个桶中,因为桶的数量通常远小于 2^32 - 1。

关于java - IdentityHashMap 是否接受碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com