我正在创建 3 个同一类的对象:A、B、rB。这里rB指的是B。A和B的值相等。我已经重写了比较值的 equals 方法。
所以
A.equals(B), A.equals(rB) and B.equals(rB) is true. But A != B, A != rB and B == rB.
现在我将 A、B、rB 放入 HashMap(例如 hm)和 IdentityHashMap(例如 ihm)中。
hm.put(A, "1");
hm.put(B, "2");
hm.put(rB, "3");
ihm.put(A, "1");
ihm.put(B, "2");
ihm.put(rB, "3");
由于我没有存储 null,因此 hm.get(A)
应返回 3,hm.get(B)
应返回 3 和 hm。 get(rB)
应返回 3。
同样,ihm.get(A)
应返回 1,ihm.get(B)
应返回 3,ihm.get(rB)
应返回返回3。
根据java文档,如果k1和k2不为空,IdentityHashMap会执行k1 == k2,而HashMap会执行k1.equals(k2)。
那么为什么hm.get(A)
返回1。
最佳答案
你说你覆盖了equals
,但是你也覆盖了hashCode
吗?如果不是,那么这可能是您所看到的行为的原因。
HashMap
仅当两个键具有相同哈希码时才会使用 equals
,因此无论何时重写 equals
时,您都必须重写hashCode
,反之亦然。
关于java - 了解 HashMap 和 IdentityHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8147667/