Прямое присвоение литерала int ссылке на Integer является примером автобокса, в котором компилятор обрабатывает литеральное значение в код преобразования объекта.
Таким образом, на этапе компиляции компилятор преобразует 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) True .