0

我有一个 Java 对象,我在其中重写了equals()比较所有值的方法。我比较的成员变量之一是HashMap<String, MyObject>. 即使存储在其中的键和 MyObjects 相等,HashMaps 似乎也不相等。

当我调试我的测试并查看两个 HashMap 时,我可以看到EntrySets 不相等。但我可以在它们中看到的唯一区别是一个有一个EntrySet.keySetnull 另一个有 Entry.keySet 是一个KeySet对象。

我现在的问题是:equals()HashMap 的方法是否依赖于这个值?

(我不想让你帮我调试我的代码,我只是想了解发生了什么)

4

1 回答 1

3

您可以通过查看HashMap#Equals()的来源轻松检查这一点。比较非空键的值。

public boolean equals(Object o) {
    if (o == this)
        return true;

    if (!(o instanceof Map))
        return false;
    Map<K,V> m = (Map<K,V>) o;
    if (m.size() != size())
        return false;

    try {
        Iterator<Entry<K,V>> i = entrySet().iterator();
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            if (value == null) {
                if (!(m.get(key)==null && m.containsKey(key)))
                    return false;
            } else {
                if (!value.equals(m.get(key)))
                    return false;
            }
        }
    } catch (ClassCastException unused) {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }

    return true;
}

编辑:

解释: Entry 是一{key,value}对。HashMapEntry在一个 EntrySet 中维护这些 s。现在比较两张地图:我可以遍历所有的Entrys 并继续比较Entry.value with anothermap.get(Entry.key)。因此,从本质上讲,equals()在比较地图时,你们中的价值对象很重要。

于 2013-08-14T14:38:18.510 回答