2011-02-25 12 views
38

Aquí ellos son la misma instancia:¿Los objetos del envoltorio entero comparten las mismas instancias solo dentro del valor 127?

Integer integer1 = 127; 
Integer integer2 = 127; 
System.out.println(integer1 == integer2); // outputs "true" 

Pero aquí son diferentes instancias:

Integer integer1 = 128; 
Integer integer2 = 128; 
System.out.println(integer1 == integer2); // outputs "false" 

¿Por qué los objetos envolventes comparten la misma instancia única dentro del valor de 127?

Respuesta

35

Porque está especificado en la Especificación del lenguaje Java.

JLS 5.1.7 Boxing Conversion:

Si el valor p siendo en caja es true, false, un byte, o una char en el intervalo \u0000 a \u007f, o un int o short número entre -128 y 127 (inclusive) , deje que r1 y r2 sean el resultado de dos conversiones de boxeo de p. Siempre es el caso que r1 == r2.

Idealmente, encajonar un valor primitivo dado p, siempre arrojaría una referencia idéntica. En la práctica, esto puede no ser factible utilizando las técnicas de implementación existentes. Las reglas anteriores son un compromiso pragmático. La cláusula final anterior requiere que ciertos valores comunes siempre estén enmarcados en objetos indistinguibles. La implementación puede almacenarlos en caché, de forma perezosa o ansiosa. Para otros valores, esta formulación no permite ninguna suposición sobre la identidad de los valores encuadrados por parte del programador. Esto permitiría (pero no requeriría) compartir algunas o todas estas referencias.

Esto garantiza que, en la mayoría de los casos, el comportamiento será el deseado, sin imponer una penalización de rendimiento excesiva, especialmente en dispositivos pequeños. Las implementaciones menos limitadas de memoria pueden, por ejemplo, almacenar en caché todos los valores char y short, así como los valores int y long en el rango de -32K a +32K.

+5

Tenga en cuenta que el JLS especifica el * mínimo * rango de caché/interno, no el * máximo * (ver última oración) ... por lo que técnicamente es "por implementación" ;-) –

+0

¿por qué lo hacen? No puedo obtenerlo – niiraj874u

+0

Y pensar: todo lo que tenían que hacer era permitir la sobrecarga del operador y nada de esto sería detectable fuera de JNI. – hoodaticus

12

La fuente de java.lang.Integer:

public static Integer valueOf(int i) { 
     final int offset = 128; 
     if (i >= -128 && i <= 127) { // must cache 
      return IntegerCache.cache[i + offset]; 
     } 
     return new Integer(i); 
    } 

Salud!

+6

La versión más reciente de Java 6 admite el cambio del valor máximo de caché a más de 127. –

1

Además de las otras respuestas, quiero agregar que == compara las referencias del objeto solamente.Utilice .equals() lugar:

Integer integer1=128; 
Integer integer2=128; 
if(integer1.equals(integer2)) 
    System.out.println(true); 
else 
    System.out.println(false); 
7

Por cierto que puede acortar su código para

System.out.println("Integer 127 == " + ((Integer) 127 == (Integer) 127)); 
System.out.println("Integer 128 == " + ((Integer) 128 == (Integer) 128)); 

for(int i=0;i<5;i++) { 
    System.out.println(
    "Integer 127 system hash code " + System.identityHashCode((Integer) 127) 
    + ", Integer 128 system hash code "+System.identityHashCode((Integer) 128)); 
} 

impresiones

Integer 127 == true 
Integer 128 == false 
Integer 127 system hash code 1787303145, Integer 128 system hash code 202703779 
Integer 127 system hash code 1787303145, Integer 128 system hash code 1584673689 
Integer 127 system hash code 1787303145, Integer 128 system hash code 518500929 
Integer 127 system hash code 1787303145, Integer 128 system hash code 753416466 
Integer 127 system hash code 1787303145, Integer 128 system hash code 1106961350 

Se puede ver que 127 es el mismo objeto cada vez, mientras que el objeto para el 128 es diferente.

Cuestiones relacionadas