web-dev-qa-db-fra.com

Java: comment tester l'égalité des tableaux?

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.");
42
user905686

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.

15
fernacolo

Utilisez Arrays.deepEquals () pour les tableaux multidimensionnels.

6
MOleYArd
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
Ashok Domadiya