3

这个oracle java 中它说:

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

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

我完全理解它的工作原理以及它是如何工作的。但是,做类似的事情并不容易:

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

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

提前致谢。

4

6 回答 6

9

地图可以有相同的但不同的

    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
于 2013-03-28T14:24:57.743 回答
3

不,因为第一种方法只检查密钥集是否相等。这在逻辑上不同于确定两张地图是否相同。

于 2013-03-28T14:24:58.110 回答
3

比较 m1.equals(m2) 将检查两个映射之间的键和值是否相等。

来自 Java 7 javadoc:

布尔等于(对象 o)

比较指定对象与此映射是否相等。如果给定对象也是一个映射并且两个映射表示相同的映射,则返回 true。更正式地说,如果 m1.entrySet().equals(m2.entrySet()),则两个映射 m1 和 m2 表示相同的映射。这确保了 equals 方法在 Map 接口的不同实现中正常工作。

于 2013-03-28T14:26:38.867 回答
1

您的第二个示例检查的内容与您的第一个示例不同。

  • 在您的第一个示例中,您仅比较两个s 的Map,而忽略与这些键关联的值。
  • 在您的第二个示例中,您比较两个s的和对应值。Map
于 2013-03-28T14:25:29.080 回答
0

这取决于您如何尝试定义地图的相等性。如果您希望它基于键,您将使用第一个功能:

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

但是,如果您对这些值更感兴趣:

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

如果你想比较完整的地图:

if (m1.entrySet().equals(m2.entrySet())) { ... }
于 2013-03-28T14:25:18.133 回答
0

不,接口中的合约Map指定比较包含键equals()的映射。因此,接口(等)的实现将遵守该合同。entrySet()MapHashMap

于 2013-03-28T14:25:27.517 回答