Комментарии (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 упрощает код, но требует понимания механики для избежания ошибок и проблем производительности.