java - HashMap 不调用 Object.equals?

标签 java object collections hashmap

我编写了一个重写类 Object 中的 equals(Object) 方法的类,以使用对象的实例值将该类类型的对象与该类类型的其他对象进行比较。

当我将对象的实例作为键放入 HashMap 中,然后使用一个新的但相同的对象作为键在映射上调用 get(Object) 时,它返回 null。

我试过将一个新的相同对象传递给 equals 方法,它返回 true,所以问题不在我的比较代码上。

根据我通过调试收集到的信息,我的对象中的 equals(Object) 方法从未被调用。

但如果您在 HashMap 中使用 String 键,然后将具有相同字符的新实例传递给 get(Object),它会成功返回值。

为什么会这样?要使用基于我的 equals 方法的 HashMap 测试键,我需要做什么?

最佳答案

您还需要覆盖 Object.hashcode() .查看链接,因为它指定 hashcode()equals() 有一个契约(Contract)来确保 HashTable 的正确功能、HashMapHashSet

HashMap 中,值存储在桶中,桶是通过键的哈希码到达的。一旦找到合适的桶,equals 方法就会应用于桶的每个成员,直到确定相等为止。因此,确保您的哈希算法“哈希良好”非常重要。

关于java - HashMap 不调用 Object.equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919941/

相关文章:

Java 构造函数的平均长度

java - Mac L&F 问题 : Differing behavior of JTextField. requestFocus()

java - Java 对象如何工作?

c++ - 赋值运算符是否调用复制构造函数?

javascript - 对象中的函数指针

c# - 安全删除 ForEach 中的 DataRow

java - 在适配器中写下太多方法是不是一个坏主意?

java - GWT:放大和缩小 Canvas 绘图

java - 在返回集合的接口(interface)中使用 Java 泛型。最佳实践?陷阱?

java - Collections.synchronizedMap() 返回类转换异常,而法线贴图工作正常