快速回答
您应该使用该equals
方法,因为已经实现了该方法以执行所需的比较。toString()
本身就像使用迭代器一样,equals
但这是一种效率较低的方法。此外,正如@Teepeemm所指出的那样,toString
它受元素顺序的影响(基本上是迭代器的返回顺序),因此不能保证为2个不同的图提供相同的输出(尤其是如果我们比较两个不同的图)。
注意/警告:你的问题我的回答假设类实现预期地图界面的尊重toString
和equals
行为。默认的Java类会这样做,但是需要检查自定义映射类以验证预期的行为。
参见:http : //docs.oracle.com/javase/7/docs/api/java/util/Map.html
boolean equals(Object o)
比较指定对象与此映射是否相等。如果给定对象也是一个映射并且两个映射表示相同的映射,则返回true 。更正式地说,如果m1.entrySet()。equals(m2.entrySet()),则两个映射m1和m2表示相同的映射。这样可确保equals方法可在Map接口的不同实现中正常工作。
Java源代码中的实现(java.util.AbstractMap)
另外,java本身负责遍历所有元素并进行比较,因此您不必这样做。看一下AbstractMap
类使用的实现HashMap
:
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;
}
比较两种不同类型的地图
toString
比较a时失败TreeMap
,HashMap
但equals
正确地比较了内容。
码:
public static void main(String args[]) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("2", "whatever2");
map.put("1", "whatever1");
TreeMap<String, Object> map2 = new TreeMap<String, Object>();
map2.put("2", "whatever2");
map2.put("1", "whatever1");
System.out.println("Are maps equal (using equals):" + map.equals(map2));
System.out.println("Are maps equal (using toString().equals()):"
+ map.toString().equals(map2.toString()));
System.out.println("Map1:"+map.toString());
System.out.println("Map2:"+map2.toString());
}
输出:
Are maps equal (using equals):true
Are maps equal (using toString().equals()):false
Map1:{2=whatever2, 1=whatever1}
Map2:{1=whatever1, 2=whatever2}