我正在创建3个相同类的对象:A,B,rB。这里rB引用B.并且A和B的值相等。我已经超越了equals方法,我在比较这些值。
所以
A.equals(B),A.equals(rB)和B.equals(rB)为真。但是A!= B,A!= rB和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。
答案 0 :(得分:3)
你说你覆盖了equals
,但你是否也覆盖了hashCode
?如果没有,那么这很可能是你所看到的行为的原因。
HashMap
只有当两个密钥具有相同的哈希码时才会使用equals
,因此每当您覆盖equals
时,您也必须覆盖hashCode
,反之亦然。
答案 1 :(得分:-1)
如上所述,A!= B,所以在IdentityHashMap中,A和B不被认为是同一个东西。你把A值设为1,B设置值2(然后用rB覆盖3)。输出与预期一样。