JavaRush /Курсы /Java Syntax Pro /Типы-обертки в Java

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

Java Syntax Pro
12 уровень , 0 лекция
Открыта

1. Список типов-оберток

Все вы знаете, что в Java есть 8 примитивных типов, которые не являются классами. С одной стороны, это хорошо: они простые и занимают мало места, а с другой — иногда нужны именно классы. Зачем именно они, вы узнаете в следующей лекции.

Так что же делать?

Начиная с пятой версии, в Java у примитивных типов появились классы-близнецы. Каждый такой класс хранит внутри одно поле со значением определенного типа. Такие классы еще называют типами-обертками, потому что они как бы оборачивают примитивные значения в классы.

Вот список таких типов, ничего не узнаете?

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

Названия примитивных типов пишутся с маленькой буквы, а классов — с большой. Также названия классов немного длиннее: Integer вместо int и Character вместо char.

Все объекты классов-оберток являются неизменяемыми (immutable).

Упрощенный код класса Integer выглядит примерно так:

Код Примечание
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}


Переменная-значение

Конструктор




Метод возвращает значение




Статический метод создает новый объект Integer для переменной типа int

2. Преобразование типа int к Integer

Типы-обертки считаются аналогами их более примитивных собратьев: можно легко создать соответствующий объект-обертку для примитивного типа.

Разберем взаимодействие примитивных типов и их типов-оберток на примере типа int. Вот как бы выглядел код преобразования типа int к типу Integer и наоборот:

Чтобы преобразовать тип int к типу Integer, нужно написать код:

Integer имя = new Integer(значение);

Где имя — это имя переменной типа Integer, а значение — это оборачиваемое значение типа int.

Примеры:

Код Примечание
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

А чтобы преобразовать тип Integer к типу int, нужно написать код:

int имя = переменная.intValue();

Где имя — это имя переменной типа int, а переменная — это переменная-ссылка на объект типа Integer.

Примеры:

Код Примечание
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110


3. Autoboxing и unboxing

Однако даже простые операции с типом Integer писать непросто.

Как мы уже говорили, тип Integer — неизменяемый (immutable). Чтобы создать объект типа Integer с новым значением типа int, нужно явно создать новый объект Integer. Зато получить значение типа int, которое хранится внутри объекта Integer, просто: нужно вызвать метод intValue().

Пример:

Код Описание
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
Оборачиваем 5 в класс Integer
Получаем значение из объекта Integer
Создаем новое значение Integer == 10

Код довольно громоздкий, не находите?

Создатели Java тоже так считают, поэтому они научили компилятор делать эти операции автоматически. Автоматическое преобразование int в Integer называется autoboxing (box — коробка, класть в коробку), а обратная операция — Integer к intunboxing.

Ваш код Что видит компилятор
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

Благодаря autoboxing и unboxing, вы можете спокойно присваивать тип int типу Integer и наоборот. Можно писать выражения любой сложности и не делать различий между типами int и Integer.

Примеры:

Код Что сгенерирует компилятор
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}

4. Сравнение переменных классов-оберток

Autoboxing и unboxing работают очень просто и прозрачно: где нужно — расставляются команды new Integer(), где нужно — вызываются методы intValue().

Для вас как для программиста все работает легко и понятно. Но учтите, что если вы сравниваете Integer и Integer, происходит сравнение ссылок, а не значений.

Код Вывод на экран
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

Переменные a и b хранят не значения (как типы int), а ссылки на объекты. Поэтому важно помнить, как правильно их сравнивать:

Неправильно Правильно
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}

Комментарии (259)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Zhenyok Avramenko Уровень 18
2 октября 2025
сделайте значения 100 и подумайте или спросите у гптшки, это очень вкусная инфа.
Артемий Уровень 50
3 сентября 2025
Первую задачу в таком виде не принимает: Integer intValueBox = Integer.valueOf(intValue); Нужно было имя класса-обертки поменять на integerValueBox. Мне кажется в обоих случаях имя должно правильно принимать.
Anton Zorin Уровень 20
29 августа 2025
Вместо лозунга "Программистами не рождаются" можно смело писать "Доспроси у AI"
REK.QA Уровень 4
5 августа 2025
А где в первой задаче вся эта красота?
Anonymous #3585174 Уровень 33
28 июня 2025
like
Aura Уровень 23
15 мая 2025
Я сначала не понял, почему при

Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));
нам выдает true, ведь нам выше показали класс Integer и его методы, однако ск***ны не сказали, что у Integer есть свой переопределенный метод equals, а я уже было хотел ругаться, что оно будет ссылаться на метод Object, который точно так же, как и оператор == сравнивает ссылки.
Aura Уровень 23
15 мая 2025
Так еще и не пояснили, что Java кэширует значение Integer от -128 до 128 и если мы напишем

Integer i = 100;
Integer j = 100;
System.out.println(i == j);
То нам выдаст true. Спасибо гптшке за пояснение этого момента
Javaslavskiy Уровень 41
21 марта 2025
Проверьте себя:

Integer x = 5;
int y = x;
System.out.println(x + y); //Результат?
System.out.println(x + "" + y); //Какой метод будет вызван, x.intValue() или x.toString()?
Юрий Болотин Уровень 16
29 марта 2025
Считаю, что... 1) Объект будет преобразован в примитивный тип данных (с помощью unboxing), а затем примитив складывается с примитивом. 2) Объект, благодаря unboxing, превращается в примитив. После этого, примитив превращается в строку ("5"). Строка + примитивный тип данных = Строка => "5" + 5 = "55". Если мои рассуждения неверны, прошу исправить.
Юрий Уровень 20
21 февраля 2025
А пачему ошибки видит он, а не я???
Жуков Богдан Уровень 26
5 апреля 2025
Потому что он поедет в Египет
Tatty Уровень 19
19 февраля 2025
Последняя задача, для меня было неочевидно, поделюсь) Сравнение примитива и объекта работает благодаря автораспаковке. Когда вы сравниваете примитив (int) с объектом (Integer), Java автоматически преобразует объект в примитив с помощью метода intValue(), после чего сравниваются два примитива. Это делает код более удобным, так как не требует явного преобразования типов.
Sarakez Уровень 33
27 января 2025
Если сравнивать в обёртке значения от -128 до 127 с помощью == он выдаёт true. Не знаю зачем и для кого я это пишу но вдруг кому понравится этот факт

public class Main
{
	public static void main(String[] args) {
		Integer a = -128;
        Integer b = -128;

        System.out.println(a == b);
	}
}
Денис Кокшаров Уровень 32
28 января 2025
лучше найти ответ и прийти с ним, а не просто с фактом
Денис Кокшаров Уровень 32
28 января 2025
ответ в том, что значения в этом диапазоне кэшируются JVM, оно используется для более быстрого доступа к данным, для каких целей это делается - не нашел, но что-то мне подсказывает, что для ускорения работу программы)
Daniil Уровень 1
29 января 2025
Это работает аналогично String pool, грубо говря. Кэшируется по значени byte. Нужно для более быстрого оперирвания мелкими значениями и экономии памяти.