Cuando compila un número literal en Java y lo 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 usa autoboxing.
valueOf
se implementa de tal manera que ciertos números se "agrupan" y devuelve la misma instancia para valores menores que 128.
Desde el código fuente de java 1.6, 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 valor de high
se puede configurar en otro valor, con la propiedad del sistema.
-Djava.lang.Integer.IntegerCache.high = 999
Si ejecuta su programa con esa propiedad del sistema, ¡saldrá verdadero!
La conclusión obvia: nunca confíes en que dos referencias sean idénticas, siempre compáralas con el .equals()
método.
Entonces b2.equals(b3)
imprimirá verdadero para todos los valores lógicamente iguales de b2, b3.
Tenga en cuenta que el Integer
caché no está allí por razones de rendimiento, sino más bien para cumplir con el JLS, sección 5.1.7 ; Se debe dar identidad de objeto para los valores -128 a 127 inclusive.
Integer # valueOf (int) también documenta este comportamiento:
Es probable que este método produzca un rendimiento de espacio y tiempo significativamente mejor al almacenar en caché los valores solicitados con frecuencia. Este método siempre almacenará en caché los valores en el rango de -128 a 127, inclusive, y puede almacenar en caché otros valores fuera de este rango.