了解HashMap和IdentityHashMap

时间:2011-11-16 06:35:09

标签: java hashmap

我正在创建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。

2 个答案:

答案 0 :(得分:3)

你说你覆盖了equals,但你是否也覆盖了hashCode?如果没有,那么这很可能是你所看到的行为的原因。

HashMap只有当两个密钥具有相同的哈希码时才会使用equals,因此每当您覆盖equals时,您也必须覆盖hashCode,反之亦然。

答案 1 :(得分:-1)

如上所述,A!= B,所以在IdentityHashMap中,A和B不被认为是同一个东西。你把A值设为1,B设置值2(然后用rB覆盖3)。输出与预期一样。