Java: comment tester l'égalité des tableaux?
Pourquoi le code suivant impression "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.");
4 réponses
Pourquoi le code suivant impression
"Different."
?
Parce que Arrays.equals
effectue un faible comparaison. Puisque les tableaux héritent leur equals
-méthode de Object
, une comparaison d'identité sera effectuée pour les tableaux intérieurs, qui échouera, puisque a
et b
ne pas voir la tableaux.
Si vous modifiez Arrays.deepEquals
il imprime "Equal."
comme prévu.
ce n'est vraiment pas évident.
tout d'Abord, le ==
l'opérateur compare juste deux pointeurs. Parce que a
et b
sont des objets distincts situés à des adresses mémoire différentes,a == b
retour false
(Hé, Java les puristes, je sais que le ==
comparez en fait les identités de l'objet. Je suis juste essayer d'être didactique).
maintenant, regardons le equals()
mise en oeuvre de les tableaux:
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");
}
ce serait imprimer Not equals
parce que aucune instance array n'implémente réellement le equals()
méthode. Donc, quand nous appelons <somearray>.equals(<otherarray>)
nous appelons en fait le Object.equals()
méthode, qui ne comparent que deux pointeurs.
cela dit, notez que votre code fait en fait ceci:
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)
finira par appeler a0.equals(b0)
qui sera de retour false
. Pour cette raison, Arrays.equals(a, b)
retour false
comme bien.
ainsi votre code s'affichera Different.
et nous concluons que L'égalité Java peut parfois être délicate.
Utiliser Des Tableaux.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;
}