Java: ¿cómo probar la igualdad de array?

¿Por qué el siguiente código de impresión es "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."); 

¿Por qué el siguiente código de impresión es "Different." ?

Porque Arrays.equals realiza una comparación superficial . Dado que las matrices heredan su equals -method from Object , se realizará una comparación de identidad para las matrices internas, que fallará, ya que a y b no hacen referencia a las mismas matrices.

Si cambia a Arrays.deepEquals , imprimirá "Equal." como se esperaba.

Realmente no es obvio.

En primer lugar, el operador == simplemente compara dos punteros. Debido a que a y b son objetos distintos ubicados en diferentes direcciones de memoria, a == b devolverá false (Hey, puristas de Java, sé que == realidad comparo las identidades de objeto . Solo estoy tratando de ser didáctico).

Ahora echemos un vistazo a la implementación equals() de matrices :

 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"); } 

Eso imprimiría Not equals porque ninguna instancia de matriz realmente implementa el método equals() . Entonces, cuando llamamos a .equals() estamos llamando al método Object.equals() , que solo compara dos punteros.

Dicho esto, observe que su código realmente está haciendo esto:

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

Los Arrays.equals(a, b) eventualmente llamarán a0.equals(b0) y devolverán false . Por esta razón, Arrays.equals(a, b) también devolverá false .

Entonces su código se imprimirá Different. y concluimos que la igualdad de Java puede ser difícil a veces.

Utilice Arrays.deepEquals () para matrices multidimensionales.

 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; }