Java HashMap';s等于取决于EntrySet.keySet?

Java HashMap';s等于取决于EntrySet.keySet?,java,hashmap,equals,Java,Hashmap,Equals,我有一个Java对象,其中我重写了用于比较所有值的equals()方法。我比较的成员变量之一是HashMap。即使其中存储的键和MyObject相等,哈希映射似乎也不相等 当我调试测试并查看这两个hashmap时,我可以看到EntrySets并不相等。但我能看到的唯一区别是,其中一个有一个EntrySet.keySet为null,另一个有Entry.keySet为keySet对象 我现在的问题是:HashMap的equals()方法是否依赖于这个值 (我不想让你帮我调试我的代码,我只想了解发生了

我有一个Java对象,其中我重写了用于比较所有值的
equals()
方法。我比较的成员变量之一是
HashMap
。即使其中存储的键和MyObject相等,哈希映射似乎也不相等

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

我现在的问题是: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;
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(映射的实例))
返回false;
Map m=(Map)o;
如果(m.size()!=size())
返回false;
试一试{
迭代器i=entrySet().Iterator();
while(i.hasNext()){
条目e=i.next();
K key=e.getKey();
V value=e.getValue();
如果(值==null){
if(!(m.get(key)==null&&m.containsKey(key)))
返回false;
}否则{
如果(!value.equals(m.get(key)))
返回false;
}
}
}捕获(ClassCastException未使用){
返回false;
}捕获(NullPointerException未使用){
返回false;
}
返回true;
}
编辑:


说明:条目是
{key,value}
对。HashMap在EntrySet中维护这些
条目。现在比较两个映射:我只需迭代所有
条目
s,并将
Entry.value与anothermap.get(Entry.key)
进行比较。因此,在比较地图时,您的值对象的
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;
}
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(映射的实例))
返回false;
Map m=(Map)o;
如果(m.size()!=size())
返回false;
试一试{
迭代器i=entrySet().Iterator();
while(i.hasNext()){
条目e=i.next();
K key=e.getKey();
V value=e.getValue();
如果(值==null){
if(!(m.get(key)==null&&m.containsKey(key)))
返回false;
}否则{
如果(!value.equals(m.get(key)))
返回false;
}
}
}捕获(ClassCastException未使用){
返回false;
}捕获(NullPointerException未使用){
返回false;
}
返回true;
}
编辑:


说明:条目是
{key,value}
对。HashMap在EntrySet中维护这些
条目。现在比较两个映射:我只需迭代所有
条目
s,并将
Entry.value与anothermap.get(Entry.key)
进行比较。因此,本质上,在比较映射时,值对象的
equals()
很重要。

您是否为
MyObject
编写了
equals()
方法?是的,如果我在HashMap之外检查包含的
MyObject
s,我认为这个问题是无法回答的,除非你展示这些地图是如何被实例化和填充的。请发布一个.
equals()
方法调用
entrySet()
,它从rockteboy的答案返回一个
集。似乎
equals
方法确实依赖于
HashMap
entrySet
。但是,在您的例子中,由
entrySet().iterator()创建的interator是否会产生不同的结果(如果键和值相同,这似乎很奇怪)。正如Paul Bellora所说:了解
HashMap
是如何实例化和填充的,这会对问题有很大帮助。您是否为
MyObject
编写了
equals()
方法?是的,如果我在HashMap之外检查包含的
MyObject
,我认为这个问题是无法回答的,除非你展示这些地图是如何被实例化和填充的。请发布一个.
equals()
方法调用
entrySet()
,它从rockteboy的答案返回一个
集。似乎
equals
方法确实依赖于
HashMap
entrySet
。但是,在您的例子中,由
entrySet().iterator()创建的interator是否会产生不同的结果(如果键和值相同,这似乎很奇怪)。正如Paul Bellora所说:了解
HashMap
是如何实例化和填充的,这将真正有助于回答这个问题。这是如何回答这个问题的?这是如何回答这个问题的?