我有一个 Java 对象,我在其中覆盖了 equals()
比较所有值的方法。我比较的成员变量之一是 HashMap<String, MyObject>
。即使其中存储的键和 MyObject 相等,HashMap 似乎也不相等。
当我调试测试并查看两个 HashMap 时,我可以看到 EntrySet
s 不相等。但我在它们中看到的唯一区别是一个有 EntrySet.keySet
为 null,另一个的 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/