【问题标题】:HashMap Not Calling Object.equals?HashMap 没有调用 Object.equals?
【发布时间】:2012-06-06 18:25:31
【问题描述】:

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

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

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

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

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

为什么会这样?我需要做什么才能让 HashMap 测试键基于我的 equals 方法?

【问题讨论】:

    标签: java object collections hashmap


    【解决方案1】:

    您还需要覆盖Object.hashcode()。查看链接,因为它指定 hashcode()equals() 具有确保 HashTableHashMapHashSet 中正常功能的合同。

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

    【讨论】:

    • 如果 equals() 为真,hashCode() 应该返回相同的整数吗?
    • 正确。最佳做法是使用 equals 用于查找相等性的相同成员编写散列算法。
    • 整数是多少有关系吗?哈希表使用 2 的幂来表示容量和负载因子是否正确?
    • 整数无关紧要。最好您的散列是多样化的(很可能最终在不同的存储桶中),以减少必须进行的对 equals 的调用次数。
    • 但是算法到底应该做什么呢?我们如何通过随机机会返回相同的整数来防止意外调用不相等的对象?
    【解决方案2】:

    您还应该覆盖 hashCode 否则它将无法工作,因为 HashMap(顾名思义)等同于基于哈希集合的相等性。覆盖 equals 的 Java“荣誉代码”是您还应该同时覆盖 hashCode。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2012-07-13
      • 1970-01-01
      相关资源
      最近更新 更多