ПрограммированиеBackend разработчик

Объясните, как работает механизм autoboxing и unboxing в Java, каковы его риски и где он может привести к ошибкам производительности или логики.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Autoboxing — это автоматическое преобразование примитивных типов (int, double и т.д.) в соответствующие им объекты-обёртки (Integer, Double и др.). Unboxing — обратное преобразование объекта-обёртки обратно в примитив.

Работает автоматически при присваивании, аргументах методов и коллекциях:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Пример autoboxing: 5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing: Integer(5) -> 5

Риски:

  • Возможен NullPointerException при unboxing'е null;
  • Неэффективное использование памяти и времени за счёт постоянного создания объектов-обёрток;
  • Сложности с == (сравнение по ссылке) и equals.

Вопрос с подвохом.

Может ли следующий код выбросить исключение? Почему?

Integer x = null; int y = x;

Ответ: Код выбрасывает NullPointerException, потому что при попытке выполнения int y = x; происходит unboxing из null в примитив, а null нельзя привести к int.

Примеры реальных ошибок из-за незнания тонкостей темы.


История

Расчёт сумм в коллекции обёрток Integer. Каждый раз, когда сумма увеличивалась, создавался новый объект Integer, приводя к значительным задержкам на реальном сервере вместо использования int.

История

Программист использовал Integer как ключ для кеша, не учитывая, что значения -128...127 кэшируются, а остальные — нет. Из-за этого == внезапно начал давать неверные результаты, что привело к неправильному удалению данных из кеша.

История

В REST API приходили nullable значения. Простой unboxing приходящего Integer иногда приводил к краху из-за неожиданного null вместо числа от клиента.