我有一个Java对象,我已经覆盖了equals()
方法来比较所有值。我比较的成员变量之一是HashMap<String, MyObject>
。即使存储在那里的密钥和MyObjects相等,HashMaps似乎也不是。
当我调试我的测试并查看两个HashMaps时,我可以看到EntrySet
s不相等。但我可以在其中看到的唯一区别是,其中一个EntrySet.keySet
为 null ,另一个将Entry.keySet作为KeySet
对象。
我现在的问题是:HashMap的equals()
方法是否依赖于此值?
(我不希望你帮我调试我的代码,我只是想了解发生了什么)
答案 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()
会很重要。