3

このOracle Javaでは、次のように述べています。

同様に、2 つの 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

比較 m1.equals(m2) は、2 つのマップ間でキーと値の両方が等しいことを確認します。

Java 7 javadoc から:

boolean equals(オブジェクト o)

指定されたオブジェクトがこのマップと等しいかどうかを比較します。指定されたオブジェクトがマップでもあり、2 つのマップが同じマッピングを表す場合は true を返します。より正式には、m1.entrySet().equals(m2.entrySet()) の場合、2 つのマップ m1 と m2 は同じマッピングを表します。これにより、equals メソッドが Map インターフェースのさまざまな実装で適切に機能することが保証されます。

于 2013-03-28T14:26:38.867 に答える
3

いいえ、最初の方法はキーセットが等しいことのみをチェックするためです。これは、2 つのマップが同じかどうかを判断することとは論理的に異なります。

于 2013-03-28T14:24:58.110 に答える
1

2 番目の例では、最初の例とは異なるものをチェックします。

  • 最初の例では、2 つの のキーのみを比較Mapし、それらのキーに関連付けられた値は無視します。
  • 2 番目の例では、2 つの 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 に答える