JavaRush /Курсы /Java Syntax Pro /Типы-обертки детально

Типы-обертки детально

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

1. Класс Integer

Integer хорош еще и тем, что это класс, а значит, у него могут быть поля и методы. И, конечно, они у него есть. Даже много — несколько десятков. Поэтому мы рассмотрим самые основные из них.

У класса Integer есть два поля, которые содержат максимальное и минимальное значение типа int:

Поле Описание
Integer.MAX_VALUE
Максимальное значение типа int
Integer.MIN_VALUE
Минимальное значение типа int

Иногда хочется присвоить переменной самое маленькое или самое большое значение типа int. Чтобы не загромождать код непонятными константами, можно очень красиво написать:

Код Описание
int min = Integer.MIN_VALUE;
min будет равняться 0x80000000

Также у класса Integer есть несколько интересных методов, вот они:

Методы Описание
String Integer.toHexString(int)
Возвращает строку — шестнадцатеричное представление числа
String Integer.toBinaryString(int)
Возвращает строку — двоичное представление числа
String Integer.toOctalString(int)
Возвращает строку — восьмеричное представление числа
Integer Integer.valueOf(int i)
Оборачивает переданный int в Integer
Integer Integer.parseInt(String)
Возвращает число, полученное из строки

Раньше вы уже сталкивались со статическим методом Integer.parseInt(). Напомним, как он работает:

int имя = Integer.parseInt(строка);

Если в метод parseInt() передать строку, содержащую число (только цифры), он распарсит эту строку и вернет число, которое в ней содержится.

Остальные методы тоже полезны. Например, некоторые из них могут преобразовывать переданное число в строку в двоичном, восьмеричном или шестнадцатеричном виде.



2. Класс Double

Класс Double, в общем-то, аналогичен классу Integer, только является оберткой не для типа int, а для типа double. У него тоже есть интересные нам поля и методы, рассмотрим некоторые из них:

Интересных полей у класса Double шесть:

Поле Описание
double Double.NEGATIVE_INFINITY
Минус бесконечность
double Double.POSITIVE_INFINITY
Плюс бесконечность
int Double.MIN_EXPONENT
Минимальное значение экспоненты (2x)
int Double.MAX_EXPONENT
Максимальное значение экспоненты (2x)
double Double.MIN_VALUE
Минимальное значение типа double
double Double.MAX_VALUE
Максимальное значение типа double

Бесконечность

Если вы разделите -1.0 на 0.0, получите отрицательную бесконечность, если 1.0 на 0.0 — положительную бесконечность. Тип double может не только делить на ноль, но и хранить такие значения.

Экспонента числа double

С экспонентой тоже все просто. Число double внутри состоит из мантисы и экспоненты. Только вот значение экспоненты — это не 10х, а 2х. Если экспонента вырастет на 1, итоговое значение числа станет больше в два раза.

MIN_EXPONENT == -1024, в итоге получаем 2-1024 примерно равно 10-308

Также у класса Double есть интересные методы:

Методы Описание
String Double.toHexString(double)
Возвращает строку — шестнадцатеричное представление числа
boolean Double.isInfinite(double)
Проверяет, является ли переданное число бесконечностью.
boolean Double.isNaN(double)
Проверяет, является ли переданное число NaN
Double Double.valueOf(double)
Оборачивает переданный double в Double
Double Double.parseDouble(String)
Возвращает число, полученное из строки

Из интересного можно отметить наличие метода isInfinite(), который возвращает true, если переданное в него число было плюс или минус бесконечность.

Аналогично работает и метод isNaN() — проверяет, является ли переданное в него число NaN: специальная константа, обозначающая неопределенность (Not a Number, Не число).



3. Класс Character

Класс Character в первую очередь интересен большим количеством утилитных статических методов, которые позволяют проверять символы на принадлежность разным категориям.

Примеры

Методы Описание
Character.isAlphabetic(int)
Проверяет, является ли символ символом алфавита
Character.isLetter(char)
Является ли символ буквой
Character.isDigit(char)
Является ли символ цифрой
Character.isSpaceChar(char)
Является ли символ пробелом, символом переноса строки или смены параграфа (коды: 12, 13, 14)
Character.isWhitespace(char)
Является ли символ разделителем: пробел, tab, и т.д.
Character.isLowerCase(char)
Символ в нижнем регистре — строчные буквы?
Character.isUpperCase(char)
Символ в верхнем регистре — заглавные буквы?
Character.toLowerCase(char)
Преобразует символ в нижний регистр
Character.toUpperCase(char)
Преобразует символ в верхний регистр

Особенностью данных методов является то, что они работают со всеми известными алфавитами: символы арабских цифр будут определяться как цифры и т.п.



4. Класс Boolean

Тип Boolean практически такой же, как тип boolean. Отличия минимальны.

Ниже мы покажем упрощенный вариант класса Boolean:

Код Описание
class Boolean
{
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);

   private final boolean value;

   public Boolean(boolean value)
   {
      this.value = value;
   }

   public boolean booleanValue()
   {
      return value;
   }

   public static Boolean valueOf(boolean value)
   {
      return (value ? TRUE : FALSE);
   }
}


Константы: TRUE и FALSE


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

Конструктор класса Boolean




Метод возвращает значение внутренней переменной-значения



Этот статический метод умеет преобразовывать true в TRUE и false в FALSE.

В типе Boolean есть две константы (два поля):

Константы класса Аналог типа boolean Описание
Boolean.TRUE
true
истина
Boolean.FALSE
false
ложь

Работать с ними можно так же, как и с типом boolean:

Код Примечание
if (Boolean.TRUE)
{
}
Boolean — единственный класс, который можно писать внутри условия
Boolean a = Boolean.TRUE;
boolean b = Boolean.TRUE;
boolean с = true;
Все три переменные равны true/TRUE
Boolean a = Boolean.TRUE;
Boolean b = Boolean.TRUE;
if (a == b)
Константы можно сравнивать и через equals и через ==

Так тоже будет работать.

Autoboxing тут работает отлично, поэтому можете пользоваться этим типом так же, как типом boolean: никаких подводных камней тут нет.

Как записано Как это работает
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

А вот как происходят сравнения между типами boolean и Boolean:

boolean a = true;
Boolean b = true; // будет равен Boolean.TRUE
Boolean c = true; // будет равен Boolean.TRUE

a == b; // true (сравниваются как примитивы по значению)
a == c; // true (сравниваются как примитивы по значению)
b == c; // true (сравниваются по ссылке, но указывают на один и тот же объект)

Если очень нужно создать независимый объект Boolean, то надо создать его явно:

boolean a = true;
Boolean b = new Boolean(true); // новый объект Boolean
Boolean c = true; // будет равен Boolean.TRUE

a == b; // true (сравниваются как примитивы по значению)
a == c; // true (сравниваются как примитивы по значению)
b == c; // false (сравниваются по ссылке, указывают на различные объекты)

И еще один пример: использование Boolean внутри if:

Код Примечание
Boolean less = (2 < 3);
if (less)
{
   ...
}
Скомпилируется и будет работать

Скомпилируется, но работать не будет:

Код Примечание
Boolean less = null;
if (less)
{
   ...
}

Ошибка. В этой строке кинется исключение


5. Кэширование значений при autoboxing

А вот с целочисленными типами-обертками подводные камни есть.

Как вы уже знаете, если вы сравниваете int и Integer, Integer преобразовывается в int:

Как записано Как это работает
int a = 5;
Integer b = 5;
if (a == b)
{
   ...
}
int a = 5;
Integer b = Integer.valueOf(5);
if (a == b.intValue())
{
   ...
}

Если сравнить между собой два объекта типа Integer, преобразовываться к типу int они не будут:

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

System.out.println(a == b); // сравнение ссылок
System.out.println(a == c);
System.out.println(b == c);




false
true
true

Хоть a == c и b == c, но a != b, т.к. при сравнении a и b сравниваются ссылки. Что, в принципе, ожидаемо.

Сюрприз

Но, вот если мы заменим 500 на 100, получим совсем другой результат:

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

System.out.println(a == b); // сравнение ссылок
System.out.println(a == c);
System.out.println(b == c);




true
true
true

Все дело в том, что при autoboxing не всегда создается действительно новый объект Integer. Для значений от -128 до 127 включительно объекты кэшируются.

В классе Integer есть скрытый массив, который хранит объекты: Integer(-128), Integer(-127), ... Integer(126), Integer(127)

Если вы напишете Integer x = 128, autoboxing создаст новый объект, а если Integer x = 127, autoboxing возьмет готовый объект из кэша (из массива).

Если вы не хотите, чтобы объект Integer брался из кэша, вам придется создать его явно, написав: Integer x = new Integer(127);

Такой кэш есть у всех типов-оберток: Integer, Long, Byte, Short, Boolean. У типа Boolean оба его значения TRUE и FALSE являются константами: по сути тоже кэшируются.


Комментарии (426)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Zoldy12 Уровень 13
4 марта 2026
Почему никто не пишет комменты?
Cantrabandire Уровень 14
17 марта 2026
никого уже нет(((
Grigoryvvv Уровень 16 Expert
10 января 2026
10.01.2026 / 13 уровень
SUNSHINE Уровень 30
16 декабря 2025
Окей, в крайней задаче передаются два объекта, это понятно. И изменение в первом условии понятно. Но опять же, если это объекты, то корректно ли сравнивать их через ">" или "<". Ведь всё-равно будут сравниваться ссылки и в этом варианте возможна ошибка, разве не так ?
Роман Уровень 47
22 декабря 2025
Фёст и секонд это же инты.
SUNSHINE Уровень 30
24 декабря 2025
Character - класс-обёртка для примитивного типа char. Переменные такого типа являются объектами, именно поэтому в данной задаче вместо символа сравнения "==" мы используем метод equals(иначе сравнивались бы ссылки объектов). Отсюда и мой вопрос, корректно ли использовать знаки ">", "<". Ведь так же должны сравниваться ссылки, по идеи.
Bohdan Уровень 1
19 января 2026
Операторы <, > не работают с объектами, а вот == работает (в первом условии ещё идут объекты, а в следующих сравнениях уже значения) Тут происходит unboxing (перевод в int), а затем уже сравнение. То есть по сути мы работаем с теми же int. При сравнении 'a' и 'a' мы получаем 97 и 97 при переводе, что помещается в кеш и передаёт один и тот же объект, а 'ы' при переводе даёт 1099, что уже выходит за рамки кеширования.
Alexandr Уровень 30
14 ноября 2025
задача "Анализ строк" нужно вспомнить метод который проходили раньше (Преобразуй строку в массив символов).
SUNSHINE Уровень 30
16 декабря 2025
а нужно ли ?;) Можно проще сделать - перебрать каждый символ строки по индексу от первого до крайнего и сравнить ;) Или это и имелось ввиду ?)
Apsel Уровень 13
19 октября 2025
Тяжка тема даёться. до сейх пор нечего не понял
Alexey Ulov Уровень 16
2 августа 2025
Что делает программа: Программа сравнивает пары символов и выводит результат сравнения на экран. Как работает: Метод main - запускает программу и вызывает метод compare четыре раза с разными парами символов: 'a' и 'a' (одинаковые латинские буквы) 'a' и 'б' (латинская и кириллическая) 'р' и 'в' (обе кириллические) 'ы' и 'ы' (одинаковые кириллические) Метод compare - принимает два символа и сравнивает их: Сначала проверяет, равны ли символы (first.equals(second)) - если да, выводит "равны" Если не равны, то сравнивает их как числа по Unicode-кодам: Если первый символ "больше" (его код больше), выводит "больше" Если первый символ "меньше" (его код меньше), выводит "меньше" Если ни одно условие не выполнилось, выводит "А как такое может быть???" Что будет выведено: "равны" (для 'a' и 'a') "меньше" (для 'a' и 'б', так как латинские буквы имеют меньшие коды Unicode) "больше" (для 'р' и 'в') "равны" (для 'ы' и 'ы') Принцип сравнения: Символы сравниваются по их числовым кодам в таблице Unicode, где каждая буква имеет свой уникальный номер.
Anonymous #3492314 Уровень 28
24 июля 2025
Пояснение в подразделе Бесконечность, в контексте Double, выглядит как анекдот про малыша, которого оставили одного дома и чтобы он не плакал поставили пластинку со сказкой, однако когда вернулись увидели рыдающего ребенка с криками "Хочу!, Хочу! Хочу!" и голос от проигрывателя с пластинкой "Малыш, хочешь я расскажу тебе сказку, малыш, хочешь я расскажу тебе сказку......."
Anonymous #3585174 Уровень 33
28 июня 2025
like
Ivan Уровень 16
13 июня 2025
Смешно получилось со 2й задачей) автору зачет!
Cegorah Уровень 20
28 апреля 2025
Когда впервые попалась задача уровня Medium накрыла паника и дрожь в пальцах: как это решать? Это ж уже не легкотня какая-то, это MEDIUM! Сейчас задачи Medium идут одна за одной и никакого пиетета уже.