Pourquoi le code suivant imprime-t-il "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.");
Ce n'est vraiment pas évident.
Tout d’abord, l’opérateur ==
compare simplement deux pointeurs. Puisque a
et b
sont des objets distincts situés à différentes adresses de mémoire, a == b
renverra false
(Hé, les puristes de Java, je sais que le ==
compare réellement les identités d'objet . J'essaie simplement d'être didactique).
Examinons maintenant la 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");
}
Cela imprimerait Not equals
car aucune instance de tableau n'implémenterait réellement la méthode equals()
. Ainsi, lorsque nous appelons <somearray>.equals(<otherarray>)
, nous appelons en fait la méthode Object.equals()
, qui compare simplement deux pointeurs.
Cela dit, remarquez que votre code est en train de le faire:
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)
appellera finalement a0.equals(b0)
qui retournera false
. Pour cette raison, Arrays.equals(a, b)
retournera également false
.
Donc, votre code imprimera Different.
et nous concluons que l’égalité Java peut parfois être délicate.
Utilisez Arrays.deepEquals () pour les tableaux multidimensionnels.
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;
}