有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java没有HashMap的等式依赖于EntrySet。钥匙套?

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

当我调试测试并查看这两个hashmap时,我可以看到EntrySet并不相等。但是我能在它们中看到的唯一区别是一个EntrySet.keySetnull,另一个是条目。作为KeySet对象的键集

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

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


共 (1) 个答案

  1. # 1 楼答案

    您可以通过查看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在入口集中维护这些Entry。现在比较两个映射:我可以遍历所有Entry并继续比较Entry.value with anothermap.get(Entry.key)。因此,本质上,在比较地图时,你的equals()值对象很重要