在this oracle java中它说:
沿着类似的路线,假设您想知道是否有两个Map对象 包含所有相同键的映射。
if(m1.keySet()。equals(m2.keySet())){ ......}
我完全理解它的作用以及它是如何工作的。但是做一些事情会更容易:
if (m1.equals(m2)){
..}
或者出于其他原因,我没有看到使用集合视图更好?
提前致谢。
答案 0 :(得分:8)
地图可以包含相同的键但不同的值:
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
答案 1 :(得分:3)
不,因为第一种方法只检查密钥集是否相等。这与确定两张地图是否相同在逻辑上是不同的。
答案 2 :(得分:3)
比较m1.equals(m2)将检查两个地图之间的键和值是否相等。
来自Java 7 javadoc:
boolean equals(Object o)
将指定对象与此映射进行相等性比较。如果给定对象也是一个映射,并且两个映射表示相同的映射,则返回true。更正式地说,如果m1.entrySet()。equals(m2.entrySet()),则两个映射m1和m2表示相同的映射。这可以确保equals方法在Map接口的不同实现中正常工作。
答案 3 :(得分:1)
您的第二个示例会检查与您的第一个示例不同的内容。
Map
的键,忽略与这些键关联的值。Map
的键和相应的值。答案 4 :(得分:0)
这取决于您如何尝试定义地图的相等性。如果您希望它基于键,您将使用第一个函数:
if (m1.keySet().equals(m2.keySet())) { ... }
但是,如果您对这些值更感兴趣:
if (m1.values().equals(m2.values())) { ... }
如果你想比较完整的地图:
if (m1.entrySet().equals(m2.entrySet())) { ... }
答案 5 :(得分:0)
不,Map
界面中的合同指定equals()
比较地图的entrySet()
,其中包含和键值。因此,Map
接口(HashMap
等)的实现将遵守该合同。