2011-12-05 9 views
5

Hola, actualmente estoy estudiando para una final de Java y estoy confundido por un simple método equals.¿Cómo funciona el método igual de una matriz?

La pregunta dada es

"Dadas las siguientes declaraciones de matrices, lo que hace la siguiente impresión"

y pensé que sería verdadero, falso, verdadero sin embargo después de copiar y pegar el el código revela que la respuesta es falsa, falsa, verdadera.

Entiendo que el == solo funciona cuando son la misma instancia del objeto, pero no entiendo por qué el primero es falso. Intenté encontrar el método en la API api pero no pude encontrar uno con los mismos argumentos.

Perdóname si esto es obvio, he estado despierto hasta tarde las últimas dos noches estudiando y estoy bastante cansado de la cafeína en este momento.

int[] d = { 1, 2, 3 }; 
int[] b = { 1, 2, 3 }; 
int[] c = d; 
System.out.println(d.equals(b)); 
System.out.println(d == b); 
System.out.println(d == c); 

Respuesta

16

Básicamente, los tipos de matriz no anulan equals para proporcionar la igualdad de valor ... por lo que terminan con la implementación por defecto en el objeto, que es la igualdad de referencia.

Para igualdad de valores en matrices (es decir, elementos iguales en el mismo orden), utilice los métodos estáticos en la clase Arrays.

+1

+1 para dar pistas sobre cómo lograr la igualdad de secuencia/valor (y no porque usted sea Jon Skeet). –

+1

Y para completar el pensamiento, hay varias sobrecargas de 'Arrays.equals', así como también' Arrays.deepEquals (Object, Object) ', que puede darte una igualdad más" natural ". – yshavit

+0

Objeto tiene un método igual ... Sabía que no podía pensar, lo entiendo ahora después de una siesta. ¡¡¡Muchísimas gracias por ayudarme a entender !! – Erik

3

Las matrices Java simples (es decir, no ArrayList o algo así) no implementan ellas mismas equals, sino que usan la implementación en Object. Esto es básicamente una comparación de direcciones.

(Pero tenga en cuenta que java.util.Arrays implementa algunas equals métodos estáticos para matrices genéricas.)

1

Una matriz es un objeto y no anula Object.equals(), por lo que la implementación estándar de objetos .equals() aplica. array.equals(something) es verdadero si y solo si array == something.

1

Las matrices extienden implícitamente Object clase. Por lo tanto, su método equals se hereda de allí. La implementación predeterminada del método equals solo comprueba la igualdad de identidad, es decir, es la misma que ==.

1

Tiene razón en que el operador == solo se compara para la igualdad de referencia, por lo que la segunda y la tercera impresión hacen lo que usted espera.

El método .equals se puede comparar de otra manera que la igualdad de referencia, pero eso requiere que la definición de clase realmente implemente ese método. Si .equals no está implementado en la clase de matriz, el tiempo de ejecución volverá a caer en Object#equals, que es la misma igualdad de referencia que se encuentra con el operador ==.

En otras palabras, parece que o bien no existe el método .equals en la clase de respaldo para las matrices, o se implementa de forma diferente que la comparación de elemento por elemento.

Cuestiones relacionadas