La asignación directa de un literal int a una referencia Integer es un ejemplo de auto-boxing, donde el compilador maneja el valor literal del código de conversión de objeto.
Entonces, durante la fase de compilación, el compilador se convierte Integer a = 1000, b = 1000;
en Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Entonces, es el Integer.valueOf()
método el que realmente nos da los objetos enteros, y si miramos el código fuente del Integer.valueOf()
método, podemos ver claramente que el método almacena en caché los objetos enteros en el rango de -128 a 127 (inclusive).
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Entonces, en lugar de crear y devolver nuevos objetos enteros, Integer.valueOf()
el método devuelve objetos Integer del interno IntegerCache
si el literal int pasado es mayor que -128 y menor que 127.
Java almacena en caché estos objetos enteros porque este rango de enteros se usa mucho en la programación diaria, lo que indirectamente ahorra algo de memoria.
La caché se inicializa en el primer uso cuando la clase se carga en la memoria debido al bloque estático. El rango máximo de la caché puede ser controlado por el-XX:AutoBoxCacheMax
opción JVM.
Este comportamiento de almacenamiento en caché no es aplicable solo para objetos Integer, similar a Integer. ByteCache, ShortCache, LongCache, CharacterCache
para Byte, Short, Long, Character
respectivamente.
Puede leer más en mi artículo Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .