Автоупаковка и распаковка
Правила автоматического преобразования
«Автоупаковка и распаковка» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Автоматическое преобразование
Автоматическая упаковка — это автоматическое преобразование Java примитива в объект-обёртку. Автоматическая распаковка — обратная операция, превращающая обёртку обратно в примитив.
Это происходит незаметно, поэтому Вы можете смешивать оба мира без явных вызовов преобразования.
Упаковка в действии
Присваивание значения int переменной типа Integer запускает автоматическую упаковку. Компилятор сам вставляет вызов Integer.valueOf.
public class Main {
public static void main(String[] args) {
int primitive = 42;
Integer boxed = primitive;
System.out.println(boxed);
}
}Распаковка в действии
Присваивание значения Integer переменной типа int запускает автоматическую распаковку. Компилятор незаметно вставляет вызов intValue.
public class Main {
public static void main(String[] args) {
Integer boxed = 99;
int primitive = boxed;
System.out.println(primitive);
}
}Упаковка в коллекциях
Чаще всего автоматическую упаковку можно увидеть при добавлении примитивов в коллекцию. Вы пишете list.add(5), а Java автоматически упаковывает значение 5 в объект Integer.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
int first = nums.get(0);
System.out.println(first);
}
}Арифметика выполняет распаковку
Когда Вы используете арифметические операторы над объектами-обёртками, Java сначала распаковывает их в примитивы, выполняет вычисление, а затем при необходимости снова упаковывает результат.
Ниже два значения Integer складываются после распаковки обоих значений.
public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 32;
int sum = a + b;
System.out.println(sum);
}
}Смешивание примитивов и обёрток
Вы можете свободно смешивать примитив и обёртку в выражении. Java распаковывает обёртку, поэтому во время вычисления обе части становятся примитивами.
public class Main {
public static void main(String[] args) {
Integer wrapped = 7;
int raw = 3;
int product = wrapped * raw;
System.out.println(product);
}
}Упаковка при вызове методов
Автоматическая упаковка применяется и к аргументам методов. Метод, ожидающий Object или обёртку, может получить примитив, а Java упакует его при передаче.
public class Main {
static void show(Object value) {
System.out.println("Got: " + value);
}
public static void main(String[] args) {
show(123);
show(true);
}
}Скрытая цена
Автоматическая упаковка удобна, но не бесплатна. Каждая упаковка создаёт объект, а часто выполняемые циклы могут создавать миллионы недолговечных объектов.
В числовых циклах, критичных для производительности, работайте непосредственно с примитивами, а не с обёртками.
public class Main {
public static void main(String[] args) {
long total = 0;
for (int i = 0; i < 5; i++) {
total += i;
}
System.out.println(total);
}
}valueOf и создание объектов
Автоматическая упаковка использует Integer.valueOf, который кэширует небольшие значения от -128 до 127. Вызов new Integer(...) всегда создаёт новый объект и теперь считается устаревшим.
Предпочитайте автоматическую упаковку, позволяя ей выполнять свою работу.
public class Main {
public static void main(String[] args) {
Integer cached = Integer.valueOf(50);
System.out.println(cached);
}
}Тернарный оператор и упаковка
Есть тонкое правило: в тернарном выражении, если одна ветвь содержит примитив, а другая — обёртку, Java может распаковать оба значения до общего примитивного типа.
В большинстве случаев это безопасно, но помните, что так могут запускаться преобразования, которых Вы не ожидали.
public class Main {
public static void main(String[] args) {
boolean flag = true;
Integer result = flag ? 1 : 2;
System.out.println(result);
}
}Когда это помогает
Автоматическая упаковка нужна, чтобы код оставался понятным при смешивании примитивов с обобщениями и коллекциями. При разумном использовании она устраняет лишние детали. При неосторожном использовании в часто выполняемых циклах она ухудшает производительность.
Быстрая проверка
Проверьте, насколько хорошо Вы усвоили правила автоматической упаковки.
Итоги
Вы узнали, как работают автоматическая упаковка и распаковка:
- Автоматическая упаковка превращает примитив в обёртку с помощью
valueOf - Автоматическая распаковка превращает обёртку обратно в примитив с помощью методов вроде
intValue - Это происходит при присваивании, работе с коллекциями, арифметических операциях и вызовах методов
- Это удобно, но создаёт объекты, поэтому избегайте автоматической упаковки в часто выполняемых циклах
Часто задаваемые вопросы
Урок «Автоупаковка и распаковка» бесплатный?
Да — полный текст урока «Автоупаковка и распаковка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Автоупаковка и распаковка»?
Правила автоматического преобразования Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Автоупаковка и распаковка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Примитивные типы и типы-обёртки
- Автоупаковка и распаковка
- Разбор и valueOf
- Подводные камни автоупаковки