web-dev-qa-db-ja.com

Java:配列の等価性をテストする方法は?

なぜ次のコードは"Different."

boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");
44
user905686

次のコードが"Different."を印刷する理由

Arrays.equalsshallow比較を実行するためです。配列はequalsからObject-メソッドを継承するため、内部配列に対してID比較が実行されますが、aおよびbsame配列を参照しないでください。

Arrays.deepEquals に変更すると、期待どおり"Equal."が出力されます。

72
aioobe

それは本当に明らかではありません。

まず、_==_演算子は2つのポインターを比較するだけです。 abは異なるメモリアドレスにある別個のオブジェクトであるため、_a == b_はfalseを返します(ねえ、Java purists 、私は_==_が実際に比較することを知っていますオブジェクトID。私はただ教訓的にしようとしています)。

equals()の実装を見てみましょうof of array

_boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };

if (c.equals(d)) {
    System.out.println("Equals");
} else {
    System.out.println("Not equals");
}
_

配列インスタンスは実際にequals()メソッドを実装しないなので、これは_Not equals_を出力します。したがって、<somearray>.equals(<otherarray>)を呼び出すとき、実際にはObject.equals()メソッドを呼び出しています。これは、2つのポインターを比較するだけです。

ただし、コードが実際にこれを実行していることに注意してください。

_boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");
_

Arrays.equals(a, b)は最終的にa0.equals(b0)を呼び出し、falseを返します。このため、Arrays.equals(a, b)falseも返します。

したがって、コードは_Different._を出力し、Java等式は時々注意を要することがあります。

15
fernacolo

多次元配列にはArrays.deepEquals()を使用します。

6
MOleYArd
public static boolean equal(double[][] a, double[][] b) {
        if (a == null) {
            return (b == null);
        }
        if (b == null) {
            return false;  // already know 'a' isn't null
        }
        if (a.length != b.length) {
            return false;
        }
        for (int i = 0; i < a.length; i++) {
            if (!Arrays.equals(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }
0
Ashok Domadiya