Прямое присвоение целочисленного литерала целочисленной ссылке - это пример автоматической упаковки, когда буквальное значение в код преобразования объекта обрабатывается компилятором.
Итак, на этапе компиляции компилятор преобразуется Integer a = 1000, b = 1000;
в Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Таким образом, это Integer.valueOf()
метод, который фактически дает нам целочисленные объекты, и если мы посмотрим на исходный код Integer.valueOf()
метода, мы ясно увидим, что метод кэширует целочисленные объекты в диапазоне от -128 до 127 (включительно).
/**
*
* 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);
}
Таким образом, вместо создания и возврата новых целочисленных объектов Integer.valueOf()
метод возвращает целочисленные объекты из внутреннего, IntegerCache
если переданный литерал int больше -128 и меньше 127.
Java кэширует эти целочисленные объекты, потому что этот диапазон целых чисел часто используется в повседневном программировании, что косвенно экономит память.
Кеш инициализируется при первом использовании, когда класс загружается в память из-за статического блока. Максимальным диапазоном кеша можно управлять с помощью -XX:AutoBoxCacheMax
опции JVM.
Такое кеширование не применимо только для объектов типа Integer, как и Integer.IntegerCache, который у нас также есть ByteCache, ShortCache, LongCache, CharacterCache
дляByte, Short, Long, Character
соответственно.
Вы можете прочитать больше в моей статье Java Integer Cache - Почему Integer.valueOf (127) == Integer.valueOf (127) Is True .