java - pasos - swing containers
Los objetos de envoltura entera comparten las mismas instancias solo dentro del valor 127? (5)
Esta pregunta ya tiene una respuesta aquí:
Aquí están la misma instancia:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2); // outputs "true"
Pero aquí son instancias diferentes:
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2); // outputs "false"
¿Por qué los objetos contenedores comparten la misma instancia solo dentro del valor 127?
Además de las otras respuestas, quiero agregar que ==
compara solo las referencias de objeto. Utilice .equals()
lugar:
Integer integer1=128;
Integer integer2=128;
if(integer1.equals(integer2))
System.out.println(true);
else
System.out.println(false);
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);
}
¡Aclamaciones!
Por cierto, puedes acortar tu código a
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));
}
huellas dactilares
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
Puede ver que 127 es el mismo objeto cada vez, mientras que el objeto para 128 es diferente.
Porque está especificado por la especificación del lenguaje Java.
JLS 5.1.7 Conversión del boxeo :
Si el valor
p
se va a encasillar estrue
,false
, unbyte
o unchar
entre el rango de/u0000
a/u007f
, o un número/u007f
oshort
entre -128 y 127 (inclusive), entoncesr 1
yr 2
sean los resultados de dos conversiones de boxeo dep
. Siempre es el caso quer 1 == r 2
.Idealmente, encajonar un valor primitivo
p
dado, 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 podrían, por ejemplo, almacenar en caché todos
short
valores dechar
yshort
, así como los valoresint
ylong
en el rango de -32K a +32K.
Porque los valores pequeños en el rango [-128, 127] se almacenan en la memoria caché y los valores más grandes no.
Para envolver enteros, Java usa http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html#valueOf%28int%29