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.");
41
demandé sur user905686 2011-11-08 17:24:49

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.

70
répondu aioobe 2015-06-07 06:55:06

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.

15
répondu fernacolo 2011-11-08 14:30:48

Utiliser Des Tableaux.deepEquals () pour les tableaux multidimensionnels.

6
répondu MOleYArd 2011-11-08 13:27:53
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
répondu Ashok Domadiya 2012-07-09 09:21:56