Java HashMap';s等于取决于EntrySet.keySet?
我有一个Java对象,其中我重写了用于比较所有值的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()方法是否依赖于这个值 (我不想让你帮我调试我的代码,我只想了解发生了
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
是如何实例化和填充的,这将真正有助于回答这个问题。这是如何回答这个问题的?这是如何回答这个问题的?