java - HashMap的equals依赖于EntrySet.keySet吗?

标签 java hashmap equals

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

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

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

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

最佳答案

您可以通过查看 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。现在比较两个 map :我可以迭代所有 Entry 并继续比较 Entry.value 与 anothermap.get(Entry.key)。因此,本质上,值对象的 equals() 在比较映射时很重要。

关于java - HashMap的equals依赖于EntrySet.keySet吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234597/

相关文章:

java - 使用接口(interface) Class<T> 作为键来获取具体的实例值?

Java Hashtable<Object, Someclass>,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值

javascript - 我应该在 Javascript 中使用 == 还是 === ?

java - 非法前向引用和枚举

java - 如何加载没有标识符的 Json 属性?

Java - table - 改变表格格式

java - 为什么添加final方法修饰符会降低代码效率?

Ada.Containers.Indefinite_Hashed_Maps 中类范围键的哈希值

java - 如何使用 Gson 序列化包含 HashMap 作为属性的类?还反序列化?

java - Android Search ArrayList of objects for only a parameter,返回对象索引