Получить доступ

Что такое autoboxing и какие ловушки он приносит?

MiddleОсновы языка
Коротко

Компилятор подставляет Integer.valueOf при упаковке и intValue при распаковке. Ловушки: == работает только внутри кэша −128…127, распаковка null — NPE, каждая упаковка вне кэша — аллокация.

  • Сравнивать обёртки — equals
  • Тернарный оператор и арифметика неожиданно распаковывают
  • В горячем коде — примитивы и примитивные стримы

А ещё Верхнюю границу кэша можно поднять: -XX:AutoBoxCacheMax

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Песочница: == против equals и кэш Integer

Подробно

Скажи, что компилятор подставляет Integer.valueOf при присваивании примитива обёртке и intValue при обратном. valueOf держит кэш на -128..127, поэтому Integer a = 100, b = 100 сравниваются по == как равные, а при 1000 — уже нет: это классическая ловушка, лечится equals. Вторая ловушка — распаковка null: Map.get вернул null, его распаковали в int и получили NPE на пустом месте. Третья — цена: в цикле на миллион итераций автоупаковка создаёт миллион объектов, поэтому в горячем коде используют примитивные массивы или IntStream.

Что хотят услышать

  • Как работает упаковка.
  • Три ловушки.

Частые ошибки

  • Считать, что == на обёртках сравнивает значения — оно случайно совпадает только внутри кэша.
  • Забывать про NPE при распаковке null из коллекции или тернарного оператора.

Что спросят дальше

  • Почему Integer.valueOf кэширует именно -128..127 и можно ли расширить границу?
  • Что произойдёт в тернарном операторе, если ветки имеют типы Integer и int?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем