2012-10-13 205 views
9

puede cualquier cuerpo explicarme qué está pasando en la salida. Si == se usa para comparar dos ref. variable simplemente verifique su referencia si son iguales, entonces ingrese si cuerpo, entonces por qué diablos aa == bb es igual si creamos el método estático valueOf() y ee == ff no es igual (lo cual está bien) si crea su objeto utilizando una nueva palabra clave?operador == comportamiento differet en el objeto de la clase contenedora

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

Salida:

== aa bb

ee = ff

+0

Un artículo interesante que describe su problema: http://tech.puredanger.com/2007/02/01/valueof/ –

Respuesta

11

Los cheques == comparador para igualdad de objetos!

Desde Integer.valueOf mantiene una caché de objetos de enteros con el valor de -128 a 127 valueOf(String) devuelve el objeto almacenado en caché, por lo tanto los resultados == comparance en verdad.

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

Para el comparance de valores de objeto siempre utilice el método .equals, por primitivos como int, long, etc se puede utilizar el comparador ==.

+0

respuesta perfecta. no sabía nada sobre la caché. verificado con 127 y 128 para obtener resultados diferentes. –

+2

En su respuesta "// a == b es verdadero" no es falso, a menos que creamos una cadena usando el nuevo método String(), las cadenas con el mismo valor apuntan a la misma cadena de objetos. Por favor, corre y revisa una vez. –

+0

@Ivar, entonces mejor dar ejemplo para Entero, ¿por qué le estás dando una respuesta incorrecta a las personas ?. Como esta respuesta tiene el voto más elevado, la gente pensará que es correcta, pero en realidad la afirmación (// a == b es falsa) es incorrecta. ¿Quieres que pegue una captura de pantalla? Mira, no sugiero ediciones pero mejor cambiar la respuesta. Y no sé cómo las personas simplemente votan sin respuesta antes de leer la respuesta completa y sin verificar si es correcta o no. Y si cambio el código, entonces tengo que cambiar toda la respuesta. Eso es como eliminar el código completo. –

3

Debido Integer.valueOf mantiene caché de números enteros de -128 a 127

Aquí está el código fuente de valueOf se puede ver claramente que vuelva mismo objeto si el valor entero es entre -128 a 127

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 

por lo su == devuelve verdadero. Si el valor es más que eso, siempre te devolverá falso.

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

Siempre debe comprobar la igualdad usando equals método

ee.equals(ff); 

Si se agrega otro si la continuación

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

salida será

ee equals ff 
1

Para ee y ff dos objetos de Integer se crean en el montón, por lo tanto, ambos hacen referencia a diferentes objetos, por lo que no son iguales cuando se utiliza el operador ==.

1

new Integer("12") crea un nuevo objeto Entero con valor 12. No importa la cantidad de veces que lo haga, está creando un objeto completamente nuevo cada vez. Es por eso que == no funciona en el segundo caso.

La JVM mantiene un caché de los objetos enteros para los valores que se creen que se utilizarán con más frecuencia (-128 - 127). Integer.valueOf("12") detrás de la escena hace lo mismo (new Integer("12")), pero antes de eso, comprueba en ese caché si para ese valor el objeto ya existe en la caché, si lo hace, entonces eso es lo que devuelve; de ​​lo contrario, crea uno nuevo, agrega al caché y lo devuelve. Es por eso que == funciona en el primer caso.

Además, para objetos, == nunca debe usarse para verificaciones de igualdad, sino que deben usarse solo para verificaciones de identidad (por ejemplo, para ver si dos variables diferentes se refieren al mismo objeto). Para la verificación de igualdad, siempre use el método equals.

+0

Interesante. No sabía lo del almacenamiento en caché ... gracias :) –

+0

De nada. :) –

Cuestiones relacionadas