通过keySet比较地图

时间:2013-03-28 14:22:12

标签: java maps equals

this oracle java中它说:

  

沿着类似的路线,假设您想知道是否有两个Map对象   包含所有相同键的映射。

     

if(m1.keySet()。equals(m2.keySet())){       ......}

我完全理解它的作用以及它是如何工作的。但是做一些事情会更容易:

if (m1.equals(m2)){
..}

或者出于其他原因,我没有看到使用集合视图更好?

提前致谢。

6 个答案:

答案 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等)的实现将遵守该合同。