2011-12-12 10 views
6

Según el Javadoc de Classjava.lang.Class y la igualdad

Cada matriz también pertenece a una clase que se refleja como un objeto de clase que es compartida por todas las matrices con el mismo tipo de elemento y el número de dimensiones

Pero cuando corro el siguiente

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(intArray.equals(int2Array)); 

me sale el resultado a continuación

1641745 
1641745 
false 

Me pregunto por qué los iguales está volviendo falsa a pesar de que tanto los arreglos son de int tipo y tener las mismas dimensiones

Respuesta

8

Esto se debe a que está llamando al equals() en las mismas instancias de matriz en lugar de su objeto Class. Proveedores:

out.println(intArray.getClass().equals(int2Array.getClass())); //prints true 

También podría escribir:

out.println(int[].class.equals(int[].class)); //prints true thankfully 

como una igualdad a un lado, la adecuación de códigos hash no necesariamente indican, sin embargo, que no importa aquí.

3

intenta llamar intArray.getClass().equals(int2Array.getClass())

2

En general, el contrato de código hash de Java sólo se requiere que:

  • Cada vez que se invoca en el mismo objeto más de una vez durante una ejecución de una aplicación Java , el método hashCode debe devolver consistentemente el mismo entero, siempre que no se modifique la información utilizada en comparaciones iguales en el objeto. Este entero no necesita ser consistente desde una ejecución de una aplicación hasta otra ejecución de la misma aplicación.
  • Si dos objetos son iguales de acuerdo con el método equals (Object), al llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.
  • No es necesario que si dos objetos son desiguales de acuerdo con el método igual (java.lang.Object), al llamar al método hashCode en cada uno de los dos objetos debe producir resultados enteros distintos. Sin embargo, el programador debe tener en cuenta que la producción de resultados enteros distintos para objetos desiguales puede mejorar el rendimiento de las tablas hash.

(De the Java documentation on Object#hashCode)

Aquí tienen dos matrices de enteros que no son iguales (por ejemplo a.equals(b) => false), pero son no (véase el tercer punto) que se requieren para volver hashcodes desiguales.


Además, tenga en cuenta que el código funcionará si se utiliza en lugar de Arrays.equalsObject#equals, de la siguiente manera. Tenga en cuenta que Arrays.equals comprueba que "ambas matrices contienen la misma cantidad de elementos, y todos los pares correspondientes de elementos en las dos matrices son iguales."

int[] intArray = { 1, 2 }; 
out.println(intArray.getClass().hashCode()); 
int[] int2Array = { 1, 2 }; 
out.println(int2Array.getClass().hashCode()); 

out.println(Arrays.equals(intArray, int2Array)); 

Ver http://www.ideone.com/HaysD para un ejemplo de trabajo.

1

Usted está comparando dos matrices diferentes. Igualdad de matriz se basa en la identidad, no contento matriz. Puesto que no son la misma matriz, el resultado es falso.

Si desea probar el contenido de dos matrices para la igualdad, hay métodos de ayuda en java.util.Arrays.

out.println(Arrays.equals(intArray, int2Array); 
+0

Hay también los métodos Arrays.deepEquals si los necesita. –

0

el implementación predeterminada de equals() se define por Object.equals(Object):

El método equals de la clase Object implementa la relación de equivalencia posible más exigente en los objetos; es decir, para cualquier valor de referencia no nulo x e y, este método devuelve verdadero si y solo si xey se refieren al mismo objeto (x == y tiene el valor verdadero).

Al comparar dos matrices utilizando equals(), se invoca el método predeterminado.

0

Ejecutar esto y la respuesta será clara:

int[] array1 = { 1, 2 }; 
int[] array2 = { 1, 2 }; 

System.out.println("array1.hashcode: " + array1.hashCode()); 
System.out.println("array2.hashcode: " + array2.hashCode()); 
System.out.println("array1.class.hashcode: " + array1.getClass().hashCode()); 
System.out.println("array2.class.hashcode: " + array2.getClass().hashCode()); 
Cuestiones relacionadas