Вопрос проверяет знание оптимизаций JVM и понимание причин неожиданного поведения при сравнении объектов-обёрток.
Кеширование Integer — это механизм повторного использования объектов для часто используемых чисел.
JVM хранит заранее созданные объекты Integer в ограниченном диапазоне значений.
По умолчанию кешируются значения от -128 до 127.
Это влияет на сравнение через ==.
Метод equals() всегда работает корректно.
Кеширование Integer — это оптимизация, связанная с автоупаковкой.
JVM хранит пул объектов Integer:
заранее созданные экземпляры
повторно используемые при автоупаковке
Диапазон по умолчанию:
от -128 до 127
Пример:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true
А вот за пределами диапазона:
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // false
Причины выбора:
историческая совместимость
частое использование маленьких чисел
экономия памяти
Диапазон кеширования можно изменить:
через параметр JVM
-XX:AutoBoxCacheMax
Это расширяет верхнюю границу кеша.
Кеширование Integer — это внутренняя оптимизация JVM, из-за которой == может вести себя неожиданно, поэтому для сравнения значений всегда нужно использовать equals().