← Назад к вопросам

Что такое Boxing?

1.8 Middle🔥 131 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Boxing и Unboxing в Java

Boxing — преобразование примитивного типа в соответствующий wrapper class. Unboxing — обратный процесс. Эта автоматизация была добавлена в Java 5.

Основные wrapper классы

  • int → Integer
  • long → Long
  • double → Double
  • boolean → Boolean
  • byte → Byte
  • short → Short
  • float → Float
  • char → Character

Boxing (Упаковка)

// Явный Boxing
int primitiveInt = 42;
Integer boxedInt = Integer.valueOf(primitiveInt);

// Автоматический Boxing (autoboxing) с Java 5
Integer autoBoxed = primitiveInt;

// Для других типов
long value = System.currentTimeMillis();
Long boxedLong = value;  // autoboxing

Unboxing (Распаковка)

// Явный Unboxing
Integer boxedInt = 42;
int primitiveInt = boxedInt.intValue();

// Автоматический Unboxing (auto-unboxing)
int autoUnboxed = boxedInt;

Long boxedLong = 1000L;
long primitiveLong = boxedLong;  // auto-unboxing

Когда требуется Boxing

В Collections:

List<Integer> numbers = new ArrayList<>();
numbers.add(10);  // autoboxing
numbers.add(20);

for (Integer num : numbers) {
    int value = num;  // auto-unboxing
}

В Generics:

// Generics требуют объектов, не примитивов
List<Integer> list = new ArrayList<>();
list.add(42);  // autoboxing

Map<Integer, String> map = new HashMap<>();
map.put(1, "один");  // autoboxing

В Method Parameters:

public void printValue(Integer number) {
    System.out.println(number);
}

int primitiveInt = 42;
printValue(primitiveInt);  // autoboxing

NullPointerException опасность

Integer boxedNull = null;

// ❌ NullPointerException при unboxing
int primitive = boxedNull;  // Ошибка!

// ✅ Безопасно
Integer value = 42;
int safe = value != null ? value : 0;

Производительность

Boxing создаёт объекты в памяти:

// ❌ Неэффективно
Long sum = 0L;
for (int i = 0; i < 1_000_000; i++) {
    sum += i;  // autoboxing на каждой итерации
}

// ✅ Эффективнее
long sum = 0;
for (int i = 0; i < 1_000_000; i++) {
    sum += i;  // примитивы
}

Кеширование

Java кеширует значения wrapper классов для оптимизации:

// Integer кеширует -128 до 127
Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true

Integer x = 128;
Integer y = 128;
System.out.println(x == y);  // false (разные объекты)

// Используй equals() для сравнения
System.out.println(x.equals(y));  // true

Best Practices

Избегай boxing в критичных циклах:

// ❌ Плохо
List<Integer> nums = new ArrayList<>();
int sum = 0;
for (Integer num : nums) {
    sum += num;  // unboxing
}

// ✅ Хорошо — примитивные потоки
int sum = nums.stream()
    .mapToInt(Integer::intValue)
    .sum();

Помни про null:

Integer optional = null;
int value = (optional != null) ? optional : -1;  // Безопасно

Boxing/Unboxing упрощает код, но требует понимания механики для избежания ошибок и проблем производительности.