java - 了解 HashMap 和 IdentityHashMap

标签 java hashmap

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

相关文章:

java - 删除整个数组

java - 如何防止我的 JScrollPane/JTextArea 超出包含的 JTabbedPane?

java - 使用 JAVA 解析 RSS Feed 时处理 CDATA

java - 如何使用流从 double 组中过滤掉非整数值?

java - SharedPreferences get 总是返回默认值而不是实际值

java - 使用 toString 方法将 HashMap 转换为 String 时如何覆盖 = 符号?

java - 简单的正则表达式不起作用

c++ - 使用 c++0x - 安全吗?

java - JAXB 将 XML 元素解码到 HashMap

java - 连续遍历 HashMap 需要什么代码?