JavaRush /Курсы /JAVA 25 SELF /Типы-обёртки в Java

Типы-обёртки в Java

JAVA 25 SELF
10 уровень , 1 лекция
Открыта

1. Введение

В языке Java существуют два разных семейства данных. Первое — это примитивные типы: int, char, double, boolean и другие. Они просты и быстры: значение хранится напрямую в ячейке памяти. Второе семейство — это ссылочные типы, то есть объекты: переменная хранит ссылку на место, где объект расположен в памяти.

Иногда требуется использовать примитив как объект. Но примитивы изначально объектами не являются. В таких случаях помогают специальные классы-обёртки.

Типы-обёртки — это классы, которые хранят внутри себя значение примитива и позволяют обращаться с ним как с объектом. Например, для int — класс Integer, для doubleDouble, для charCharacter, для booleanBoolean. Такие классы предоставляют методы: Integer.parseInt(), Double.isInfinite(), Character.isLetter(), Boolean.parseBoolean() и др.

Пример получения Integer-объекта из int-примитива:

// Примитив
int a = 10;

// Объект-обёртка
Integer b = Integer.valueOf(10);

В переменной a хранится само число 10. А переменная b хранит ссылку на объект, который внутри себя содержит 10.

2. Зачем нужны обёртки

Примитив — это всегда конкретное значение, его нельзя сделать равным null. Объект может не существовать и хранить пустое значение — это удобно, когда нужно обозначить «неизвестно» или «отсутствует».

У примитива нет методов. Нельзя вызвать у числа что-то вроде x.toString(). Обёртка предоставляет такие возможности: Integer.parseInt("123") превращает строку в число, а число можно превратить в строку с помощью toString().

Итого: обёртки нужны там, где требуется именно объект — возможность хранить null, вызывать методы, передавать значения в API, которое принимает только объекты (например, коллекции типа List<Integer>).

Полный список типов-обёрток

Примитивный тип Класс-обёртка
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

3. Упаковка и распаковка

Когда вы вручную создаёте объект-обёртку, вы берёте примитив и «упаковываете» его внутрь объекта:

int primitive = 42;
Integer wrapper = Integer.valueOf(primitive); // упаковка

Чтобы достать обратно примитивное значение — «распаковать» — используют, например, intValue():

Integer wrapper = Integer.valueOf(42);
int primitive = wrapper.intValue(); // распаковка

Автоупаковка (Autoboxing)

Компилятор сам добавит вызов valueOf(), если вы присваиваете примитив переменной-обёртке:

int a = 10;
Integer b = a; // автоупаковка (Integer.valueOf(a))

Автораспаковка (Unboxing)

Обратная ситуация — когда объект-обёртка используется там, где нужен примитив:

Integer c = 20;
int d = c; // автораспаковка (c.intValue())

int a = 10; // примитив
Integer b = a; // автоупаковка
Integer c = Integer.valueOf(20);
int d = c; // автораспаковка
Автоупаковка и автораспаковка

4. Подводные камни

Сравнение обёрток. Оператор == для объектов сравнивает ссылки, а не значения:

Integer m = 200;
Integer n = 200;
System.out.println(m == n); // false, потому что это разные объекты

Java кэширует обёртки чисел в диапазоне от -128 до 127, поэтому иногда == вернёт true, а иногда — false. Для сравнения значений всегда используйте equals():

Integer x = 100;
Integer y = 100;
System.out.println(x == y);      // true, попали в кеш
System.out.println(x.equals(y)); // true, сравнение по значению

NullPointerException при автораспаковке. Если обёртка равна null, а вы пытаетесь её распаковать — получите исключение:

Integer value = null;
int primitive = value; // Ошибка! NullPointerException

Производительность и память. Обёртки медленнее примитивов и занимают больше памяти. В горячих участках кода и при работе с большими массивами чисел выбирайте примитивы.

5. Примеры

Примеры работы с Integer и Double

Преобразование строки в число:

String text = "123";
int number = Integer.parseInt(text);
System.out.println(number); // 123

Проверка особых значений вещественных чисел:

double d = 1.0 / 0;
System.out.println(Double.isInfinite(d)); // true

double nan = 0.0 / 0.0;
System.out.println(Double.isNaN(nan)); // true

Примеры работы с Character

char хранит один символ; обёртка Character даёт удобные проверки:

char ch = 'A';
Character wrapper = ch; // автоупаковка

System.out.println(Character.isLetter(ch)); // true
System.out.println(Character.isDigit(ch));  // false
System.out.println(Character.toLowerCase(ch)); // 'a'

Примеры работы с Boolean

Примитив boolean — это только true/false. Обёртка Boolean позволяет хранить ещё и null:

Boolean flag = null; // допустимо
flag = Boolean.TRUE; // специальная константа

System.out.println(flag); // true

Преобразование строк в логические значения:

String s1 = "true";
String s2 = "false";
boolean b1 = Boolean.parseBoolean(s1);
boolean b2 = Boolean.parseBoolean(s2);

System.out.println(b1); // true
System.out.println(b2); // false
1
Задача
JAVA 25 SELF, 10 уровень, 1 лекция
Недоступна
Запись очков игрока 🎮
Запись очков игрока 🎮
1
Задача
JAVA 25 SELF, 10 уровень, 1 лекция
Недоступна
Проверка ввода цифры 🔢
Проверка ввода цифры 🔢
1
Задача
JAVA 25 SELF, 10 уровень, 1 лекция
Недоступна
Передача ценников в цифровую корзину 🛒
Передача ценников в цифровую корзину 🛒
1
Задача
JAVA 25 SELF, 10 уровень, 1 лекция
Недоступна
Обработка "сломанных" данных 📉
Обработка "сломанных" данных 📉
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Tomoto Уровень 10
11 марта 2026
+
Grrbrr7 Уровень 30
29 октября 2025
Не понял почему в примерах ниже аргументом является (ch) а не (wrapper): Примеры работы с Character char хранит один символ; обёртка Character даёт удобные проверки: char ch = 'A'; Character wrapper = ch; // автоупаковка System.out.println(Character.isLetter(ch)); // true System.out.println(Character.isDigit(ch)); // false System.out.println(Character.toLowerCase(ch)); // 'a'
Ловкий Лев Уровень 21
5 ноября 2025
Метод Character.isDigit() ожидает на вход именно примитив char. Если передать объект Character, код тоже будет работать - произойдёт автораспаковка (Character --> char), и на самом деле вызовется метод isDigit(char ch). Это поведение обеспечивается синтаксическим сахаром, добавленным в Java 5. То есть выражение

Character.isDigit(wrapper);
компилятор фактически преобразует в

Character.isDigit(wrapper.charValue());
Аналогично работают и другие методы класса Character.
Dthmth Уровень 11
25 октября 2025
В начале назвается "Класс-обертка", далее "тип-обертка". Корректнее какое название использовать?
Sdsadasd Уровень 15
19 декабря 2025
В документациях указывают ,,Wrapper classes". Более коректно мне кажется будет ,,Класс-обёртка".