Что такое autoboxing и какие ловушки он приносит?
Компилятор подставляет Integer.valueOf при упаковке и intValue при распаковке. Ловушки: == работает только внутри кэша −128…127, распаковка null — NPE, каждая упаковка вне кэша — аллокация.
- Сравнивать обёртки — equals
- Тернарный оператор и арифметика неожиданно распаковывают
- В горячем коде — примитивы и примитивные стримы
А ещё Верхнюю границу кэша можно поднять: -XX:AutoBoxCacheMax
Подробно
Скажи, что компилятор подставляет 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?
Разбор темы
- Примитивы, обёртки и Integer cache
Восемь примитивов и их диапазоны, autoboxing, кэш Integer и ловушка ==, NPE при распаковке и цена боксинга.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.