比较KeySet方式的Map

4
这个 Oracle Java 文档中提到:

同样地,假设你想要知道两个 Map 对象是否包含所有相同的键值映射。

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

我完全理解它是如何工作的。但是,做类似下面的事情会不会更容易些呢?
if (m1.equals(m2)){
..}

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

提前致谢。


m1.equals(m2) 相当于 m1.entrySet().equals(m2.entrySet()) - Qwerky
6个回答

10

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

    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

3
不行,因为第一种方式只检查键集是否相等。这在逻辑上与确定两个映射是否相同是不同的。

3

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

来自Java 7 javadoc:

boolean equals(Object o)

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


1

你的第二个例子检查的内容与第一个例子不同。

  • 在第一个例子中,你只比较了两个Map,忽略了与这些键相关联的值。
  • 在第二个例子中,你比较了两个Map和相应的

0

这取决于你试图如何定义地图的相等性。如果你想基于键来定义,那么你会使用第一个函数:

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

如果您更关心数值方面:

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

如果你想要比较整个地图:

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

0
不,Map 接口中的合同规定 equals() 比较地图的 entrySet(),其中包含键和值。因此,Map 接口的实现(如 HashMap 等)将遵守该合同。

1
Map 没有 equals() 的实现,它是一个接口。 - Qwerky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接