在这个oracle java 中它说:
类似地,假设您想知道两个 Map 对象是否包含所有相同键的映射。
if (m1.keySet().equals(m2.keySet())) { ... }
我完全理解它的工作原理以及它是如何工作的。但是,做类似的事情并不容易:
if (m1.equals(m2)){
..}
或者由于其他原因,我没有看到使用集合视图更好?
提前致谢。
地图可以有相同的键但不同的值:
Map<String, String> m1 = new HashMap<>();
m1.put("x", "1");
m1.put("y", "2");
Map<String, String> m2 = new HashMap<>();
m2.put("x", "1");
m2.put("y", "4");
System.out.println(m1.equals(m2)); // false
System.out.println(m1.keySet().equals(m2.keySet())); // true
不,因为第一种方法只检查密钥集是否相等。这在逻辑上不同于确定两张地图是否相同。
比较 m1.equals(m2) 将检查两个映射之间的键和值是否相等。
来自 Java 7 javadoc:
布尔等于(对象 o)
比较指定对象与此映射是否相等。如果给定对象也是一个映射并且两个映射表示相同的映射,则返回 true。更正式地说,如果 m1.entrySet().equals(m2.entrySet()),则两个映射 m1 和 m2 表示相同的映射。这确保了 equals 方法在 Map 接口的不同实现中正常工作。
您的第二个示例检查的内容与您的第一个示例不同。
Map
,而忽略与这些键关联的值。Map
这取决于您如何尝试定义地图的相等性。如果您希望它基于键,您将使用第一个功能:
if (m1.keySet().equals(m2.keySet())) { ... }
但是,如果您对这些值更感兴趣:
if (m1.values().equals(m2.values())) { ... }
如果你想比较完整的地图:
if (m1.entrySet().equals(m2.entrySet())) { ... }
不,接口中的合约Map
指定比较包含键和值equals()
的映射。因此,接口(等)的实现将遵守该合同。entrySet()
Map
HashMap