なぜ次のコードは"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.");
次のコードが
"Different."
?を印刷する理由
Arrays.equals
はshallow比較を実行するためです。配列はequals
からObject
-メソッドを継承するため、内部配列に対してID比較が実行されますが、a
およびb
はsame配列を参照しないでください。
Arrays.deepEquals
に変更すると、期待どおり"Equal."
が出力されます。
それは本当に明らかではありません。
まず、_==
_演算子は2つのポインターを比較するだけです。 a
とb
は異なるメモリアドレスにある別個のオブジェクトであるため、_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等式は時々注意を要することがあります。
多次元配列にはArrays.deepEquals()を使用します。
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;
}