Что такое распаковка (Unboxing) в Java?

«Что такое распаковка (Unboxing) в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Распаковка (Unboxing) – это процесс автоматического преобразования объекта-обертки (Integer, Double, Boolean и т.д.) в соответствующий ему примитивный тип (int, double, boolean). Это обратная операция к автоупаковке (Autoboxing).

Как это работает: Компилятор Java автоматически вставляет вызов соответствующего метода *Value() при необходимости.

Примеры:

// Автоупаковка (Autoboxing): int -> Integer
Integer boxed = 100;

// Распаковка (Unboxing): Integer -> int
int primitive = boxed; // Компилятор преобразует это в: int primitive = boxed.intValue();

// Распаковка в выражениях
Integer a = 10, b = 20;
int sum = a + b; // a и b распаковываются, сложение происходит с примитивами
boolean flag = Boolean.TRUE; // Распаковка Boolean -> boolean

Ключевая опасность – NullPointerException: Если объект-обертка содержит null, попытка распаковки вызовет исключение.

Integer possibleNull = getValueFromExternalSource(); // Может вернуть null
int value = possibleNull; // NullPointerException!

// Безопасный подход
int safeValue = (possibleNull != null) ? possibleNull : 0;
// Или с Java 8+
int safeValue = Optional.ofNullable(possibleNull).orElse(0);

Зачем это нужно? Unboxing/Autoboxing обеспечивают мост между примитивными типами и объектными коллекциями, упрощая код:

// Без автоупаковки/распаковки (старый стиль)
List<Integer> oldList = new ArrayList<>();
oldList.add(Integer.valueOf(42)); // Явная упаковка
int val = oldList.get(0).intValue(); // Явная распаковка

// С автоупаковкой/распаковкой
List<Integer> list = new ArrayList<>();
list.add(42); // Автоупаковка
int val = list.get(0); // Распаковка