HashMap的等于是否依赖于EntrySet.keySet?

时间:2013-08-14 14:33:17

标签: java hashmap equals

我有一个Java对象,我已经覆盖了equals()方法来比较所有值。我比较的成员变量之一是HashMap<String, MyObject>。即使存储在那里的密钥和MyObjects相等,HashMaps似乎也不是。

当我调试我的测试并查看两个HashMaps时,我可以看到EntrySet s不相等。但我可以在其中看到的唯一区别是,其中一个EntrySet.keySet null ,另一个将Entry.keySet作为KeySet对象。

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

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

1 个答案:

答案 0 :(得分: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;
}

修改

说明:条目是{key,value}对。 HashMap在EntrySet中维护这些Entry。现在比较两个地图:我可以遍历所有Entry并继续比较Entry.value with anothermap.get(Entry.key)。因此,在比较地图时,实际上{value}对象的equals()会很重要。