2010-06-21 9 views
16

La salida del programa actual es "Extraño". Pero ambas variables comparten la misma referencia. ¿Por qué la segunda y la tercera comparación no son verdaderas?Comparación entre variables que apuntan al mismo objeto Entero

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

Salida: Strange

+0

Unboxing es probablemente la respuesta. Sin embargo, no tengo una idea real. – jjnguy

+9

+1 para demostrar un uso imperdonable de autoboxing. –

Respuesta

19

Ese es el artefacto de autoboxing y un hecho que es inmutable de enteros en Java.

El a++ y a-- se traducen aproximadamente a esto.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Tenga en cuenta que si reemplaza 'a = new Integer (2)' con 'a = Integer.valueOf (2)', también se imprimirá "Strangest" ya que usará el caché de enteros para obtener la instancia. –

+0

¿Qué quiere decir con caché de enteros en su comentario? puedes elaborar ? – restrictedinfinity

+4

@restrictedinfinity. Al menos en Sun's Java, Byte, Short y Integer tienen un caché de 256 valores que van desde -128 hasta 127 inclusive que son servidos por el método 'Type.valueOf()'. Entonces en nuestro caso después de 'a -' el valor int es '2' y sería el mismo con el que hemos comenzado, por lo que' Integer.valueOf (2) 'hubiera devuelto el mismo objeto' Integer'. Tenga en cuenta que ese tipo 'Largo' no tiene un caché, por lo tanto' Long.valueOf' siempre devuelve un nuevo objeto. –

6
  • Strage - es obvio, las dos variables apuntan al mismo objeto

  • no Stranger debido autoboxing. Integer es inmutable, por lo que cada operación en él crea una nueva instancia.

  • no Strangest, debido al punto anterior, y porque ha utilizado new Integer(..) que ignora la memoria caché que se utiliza para el rango de bytes. Si usa Integer.valueOf(2) inicialmente, se usará el Integer s guardado en caché y también se imprimirá Strangest.

Cuestiones relacionadas