Пряме присвоєння 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) вірно .