Пряме присвоєння int literal посиланню на 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()метод повертає об'єкти Integer з внутрішнього, IntegerCacheякщо переданий int літерал більший -128 та менше 127.
Java кешує цілі цілі об'єкти, оскільки цей діапазон цілих чисел багато використовується в щоденному програмуванні, що опосередковано економить деяку пам'ять.
Кеш ініціалізується при першому використанні, коли клас завантажується в пам'ять через статичний блок. Максимальний діапазон кешу можна керувати за допомогою -XX:AutoBoxCacheMaxпараметра JVM.
Таке поведінка кешування не застосовується лише для об'єктів Integer, подібно до Integer.IntegerCache, який ми також маємо ByteCache, ShortCache, LongCache, CharacterCacheдляByte, Short, Long, Character відповідно.
Ви можете прочитати більше в моїй статті Кеш Java Integer - Чому Integer.valueOf (127) == Integer.valueOf (127) вірно .