Why is the following code printing \"Different.\"
?
boolean[][] a = { {false,true}, {true,false} };
bool
Why is the following code printing
"Different."
?
Because Arrays.equals performs a shallow comparison. Since arrays inherit their equals
-method from Object
, an identity comparison will be performed for the inner arrays, which will fail, since a
and b
do not refer to the same arrays.
If you change to Arrays.deepEquals it will print "Equal."
as expected.
It's really not obvious.
First of all, the ==
operator just compare two pointers. Because a
and b
are distinct objects located at different memory addresses, a == b
will return false
(Hey, Java purists, I know that the ==
actually compare object identities. I'm just trying to be didactic).
Now let's take a look at the equals()
implementation of arrays:
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");
}
That would print Not equals
because no array instance actually implements the equals()
method. So, when we call <somearray>.equals(<otherarray>)
we are actually calling the Object.equals()
method, which just compare two pointers.
That said, notice that your code is actually doing this:
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.");
The Arrays.equals(a, b)
will eventually call a0.equals(b0)
which will return false
. For this reason, Arrays.equals(a, b)
will return false
as well.
So your code will print Different.
and we conclude that Java equality can be tricky sometimes.
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;
}
Use Arrays.deepEquals() for multidimensional arrays.