Java: Como testar a igualdade de array?

Por que o código a seguir está imprimindo "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 que o código a seguir está imprimindo "Different." ?

Porque Arrays.equals realiza uma comparação superficial . Como as matrizes herdam seu método equals de Object , uma comparação de identidade será executada para as matrizes internas, que falharão, pois a e b não se referem aos mesmos arrays.

Se você mudar para Arrays.deepEquals ele imprimirá "Equal." como esperado.

Não é realmente óbvio.

Primeiro de tudo, o operador == apenas compara dois pointers. Como b são objects distintos localizados em endereços de memory diferentes, a == b retornará false (Ei, puristas Java, eu sei que o == realmente compara identidades de objects . Eu só estou tentando ser didático).

Agora vamos dar uma olhada na implementação equals() das matrizes :

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

Isso imprimiria Not equals porque nenhuma instância de array implementa realmente o método equals() . Então, quando chamamos .equals() , estamos na verdade chamando o método Object.equals() , que apenas compara dois pointers.

Dito isso, observe que seu código está realmente fazendo isso:

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

Os Arrays.equals(a, b) eventualmente chamarão a0.equals(b0) que retornará false . Por esse motivo, Arrays.equals(a, b) retornará false também.

Então seu código irá imprimir Different. e concluímos que a igualdade de Java pode ser complicada às vezes.

Use Arrays.deepEquals () para matrizes multidimensionais.

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