Cuando se compila un número literal en Java y la asigna a un entero (capital I
) el compilador emite:
Integer b2 =Integer.valueOf(127)
Esta línea de código también se genera cuando se utiliza autoboxing.
valueOf
se implementa de tal manera que ciertos números se "combinaron", y se devuelve la misma instancia para valores más pequeños que 128.
A partir del código fuente de Java 1.6, la línea 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
El el valor de high
se puede configurar a otro valor, con la propiedad del sistema.
-Djava.lang.Integer.IntegerCache.high = 999
Si ejecuta su programa con que la propiedad del sistema, lo hará verdadera salida!
La conclusión obvia: nunca confíe en que dos referencias sean idénticas, siempre compárelas con el método .equals()
.
De modo que b2.equals(b3)
se imprimirá verdadero para todos los valores lógicamente iguales de b2, b3.
Tenga en cuenta que la caché de enteros no está allí por motivos de rendimiento, sino que se comporta en el JLS, section 5.1.7; la identidad del objeto debe darse para los valores -128 a 127 inclusive.
Integer#valueOf(int) documentos también este comportamiento:
este método es probable que el rendimiento significativamente mejor rendimiento de espacio y tiempo al almacenar en caché los valores solicitados con frecuencia. Este método siempre almacenará en caché los valores en el rango -128 a 127, inclusive, y puede almacenar en caché otros valores fuera de este rango.
Usted puede encontrar http://bexhuff.com/2006/11/java-1-5-autoboxing-wackyness informativo. –
¿cómo llegaste al punto de hacer esta pregunta? es muy divertido, pero uno nunca se encuentra con algo así "en el mundo real" ... ¿o? –
http://stackoverflow.com/a/11882284/57695 –