Вопрос с собеседования · Java

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

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

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

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

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

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

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

Подробно

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

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

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

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

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

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Автоматическое приведение int к long без потери точности при любых операциях
  • ✓Упаковка через Integer.valueOf; == работает лишь в кэше −128…127, распаковка null даёт NPE
  • ✗Упаковка безопасна: == у обёрток всегда сравнивает значения
  • ✗Преобразование коллекций в массивы

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования