- что такое классы-обертки;
- автоупаковка/распаковка примитивов;
- работа класса Integer, его методы и константы.

Классы-обертки примитивных типов
Как известно, в Java есть различные типы данных, которые условно можно разделить на два блока:- примитивные;
- ссылочные.
- целые числа — byte, short, int, long;
- числа с плавающей точкой (вещественные) — float, double;
- логический тип данных — boolean;
- символьный тип данных — char.
Примитивный тип | Класс обертка |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
The Integer
Класс Integer — это класс-обертка примитивного типа int. Внутри данного класса содержится единственное поле типа int.
Будучи классом оберткой, Integer предоставляет различные методы для работы с int, а также ряд методов для преобразования int в String и String в int.
Ниже мы рассмотрим различные примеры работы с классом. Начнем с создания. Чаще всего используется (да и проще всего использовать) следующий вариант создания:
Integer a = 3;
То есть инициализация Integer переменной в данном случае аналогична инициализации int переменной. Более того, Integer переменную можно проинициализировать значением int переменной:
int i = 5;
Integer x = i;
System.out.println(x); // 5
В кейсе выше неявно происходит автоупаковка. Мы поговорим еще о ней ниже.
Помимо вариантов инициализации, указанных выше, переменную Integer можно создать, как и прочие объекты, с использованием конструктора и ключевого слова new:
Integer x = new Integer(25);
System.out.println(x);
Однако так дольше писать и дольше читать, поэтому данный вариант наименее распространен.
С Integer переменными можно делать все то, что и с int переменными. Их можно:
Складывать |
|
Вычитать |
|
Умножать |
|
Делить |
|
Инкрементировать |
|
Декрементировать |
|
Integer a = null;
Integer b = a + 1; // Здесь мы упадем с "Exception in thread "main" java.lang.NullPointerException"
System.out.println(b);
Операции сравнения в основной массе проводятся также, как и в примитивном типе int:
Integer a = 1;
Integer b = 2;
System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
Output:
false
false
true
true
Особняком стоит операция сравнения двух Integer переменных. И дело тут в том, что Integer — это ссылочный тип данных, и его переменные хранят ссылки на значения, а не сами значения (объекты). Проявления этого факта можно наблюдать при выполнении следующего фрагмента кода:
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
System.out.println(a == b); // true
System.out.println(a == c); // false
Результат первого равенства будет true, а второго — false. Так происходит, потому что в первом случае мы сравниваем две переменные (“а” и “b”), которые хранят в себе ссылки на один и тот же объект. А во втором случае мы сравниваем две переменные, ссылающиеся на два разных объекта (при создании переменной “c” мы создали новый объект).
Приведем еще 1 интересный пример:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a == b); // true
System.out.println(x == y); // false
Как мы видим, результат первого сравнения у нас true, а результат второго — false. Тут все дело в кэшировании. Все целые числа в промежутке от -128 до 127 включительно (данные значения можно кастомизировать) кэшируются. Поэтому когда мы создаем новую переменную и присваиваем ей целочисленное значение, лежащее в промежутке от -128 до 127, мы не создаем новый объект, а присваиваем переменной ссылку на уже созданный объект в кэше.
Теперь, зная этот факт, пример выше не кажется таким уж мистическим. Переменные а и b ссылаются на один и тот же объект — объект из кэша. А во время инициализации переменных x и y мы каждый раз создавали новый объект, и данные переменные хранили в себе ссылки на разные объекты. А как известно, оператор == сравнивает значения переменных, а значением ссылочных переменных являются ссылки.
Чтобы безошибочно проверять на равенство две Integer переменные, необходимо использовать (как бы банально это ни звучало) метод equals. Перепишем пример выше:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a.equals(b)); // true
System.out.println(x.equals(y)); // true
Автоупаковка и распаковка Integer
Что такое автоупаковка и распаковка? При создании новых Integer переменных мы использовали такую конструкцию:
Integer a = 2020;
Таким образом мы создавали новый объект без использования ключевого оператора new. Такое возможно благодаря механизму автоупаковки примитивного типа int. Обратная процедура проявляется при присваивании примитивной переменной int значения ссылочной Integer переменной:
Integer a = 2020;
int x = a;
В данном случае мы вроде бы присвоили ссылку (а именно — ссылка на объект является значением переменной “а”) примитивной переменной. Но по факту благодаря механизму автораспаковки в переменную “х” записалось значение 2020.
Автоупаковка/распаковка — весьма распространенное явление в Java. Часто оно происходит само собой, иногда даже без ведома программиста. Но знать об этом явлении все же нужно. У нас на Javarush есть интересная статья на эту тему.
Константы класса Integer
Класс Integer предоставляет различные константы и методы для работы с целыми числами. В данном разделе мы более подробно рассмотрим некоторые из них на практике. Начнем с констант. В таблице ниже приведены все константы класса:Костанта | Описание |
---|---|
SIZE | Количество битов в двузначной системе счисления, занимаемое типом int |
BYTES | Количество байтов в двузначной системе счисления, занимаемое типом int |
MAX_VALUE | Максимальное значение, которое вмещает в себя тип int |
MIN_VALUE | Минимальное значение, которое вмещает в себя тип int |
TYPE | Возвращает объект типа Class от типа int |
public static void main(String[] args) {
System.out.println(Integer.SIZE);
System.out.println(Integer.BYTES);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.TYPE);
}
В результате получим следующий вывод:
32
4
2147483647
-2147483648
int
Методы класса Integer
А теперь кратко рассмотрим наиболее используемые методы класса Integer. Итак, “топ” возглавляют методы по преобразованию числа из строки, либо преобразованию строки из числа. Начнем с преобразований строки в число. Для этих целей служит метод parseInt, сигнатура ниже:static int parseInt(String s)
int i = Integer.parseInt("10");
System.out.println(i); // 10
Если преобразование невозможно — например, мы передали слово в метод parseInt — будет брошено исключение NumberFormatException.
У метода parseInt(String s) есть перегруженный собрат:
static int parseInt(String s, int radix)
System.out.println(Integer.parseInt("0011", 2)); // 3
System.out.println(Integer.parseInt("10", 8)); // 8
System.out.println(Integer.parseInt("F", 16)); // 15
Методы parseInt возвращают примитивный тип данных int.
У данных методов есть аналог — метод valueOf. Некоторые вариации данного метода внутри себя просто вызывают parseInt. Отличие от parseInt в том, что результатом работы valueOf будет Integer, а не int. Рассмотрим ниже все варианты данного метода и пример его работы:
- static Integer valueOf(int i) — возвращает Integer значением которого является i;
- static Integer valueOf(String s) — аналогичен parseInt(String s), но результатом будет Integer;
- static Integer valueOf(String s, int radix) — аналогичен parseInt(String s, int radix), но результатом будет Integer.
int a = 5;
Integer x = Integer.valueOf(a);
Integer y = Integer.valueOf("20");
Integer z = Integer.valueOf("20", 8);
System.out.println(x); // 5
System.out.println(y); // 20
System.out.println(z); // 16
Мы рассмотрели методы, позволяющие перевести String в int/Integer. Обратная процедура достигается с помощью методов toString.
У любого Integer объекта можно вызвать метод toString и получить его строковое представление:
Integer x = 5;
System.out.println(x.toString()); // 5
Однако в связи с тем, что метод toString часто вызывается у объектов неявно (например, при передаче объекта на печать в консоль), данный метод редко используется разработчиками в явном виде.
Есть также и статический метод toString, который принимает в себя int параметр и переводит его в строковое представление. Например:
System.out.println(Integer.toString(5)); // 5
Однако, как и не статический метод toString, использование статического в явном виде можно встретить редко.
Более интересен статический метод toString, который принимает 2 целочисленных параметра:
- static String toString(int i, int radix) — переведет i в строковое представление в системе счисления radix.
System.out.println(Integer.toString(5, 2)); // 101
В классе Integer есть пару методов для нахождения максимума/минимума из двух чисел:
- static int max(int a, int b) вернет наибольшее из значений среди переданных переменных;
- static int min(int a, int b) вернет наименьшее из значений среди переданных переменных.
int x = 4;
int y = 40;
System.out.println(Integer.max(x,y)); // 40
System.out.println(Integer.min(x,y)); // 4
Заключение
В данной статье мы рассмотрели класс Integer. Поговорили о том, что это за класс, что такое классы обертки. Рассмотрели класс с практической точки зрения. Разобрали примеры арифметических операций, в том числе операций сравнения. Взглянули на тонкости сравнения двух Integer переменных, разобрали такое понятие как кэшированные объекты. Также, мы упомянули о таком явлении как автоупаковка/распаковка примитивных типов данных. Кроме того, мы успели рассмотреть некоторые методы класса Integer, а также некоторые константы. Привели примеры перевода чисел из одной системы счисления в другую.Домашнее задание
Изучить, какие еще есть методы класса Integer (изучать можно на сайте с официальной документацией), написать в комментариях, какой из изученных вами методов (без учета тех, которые приведены в статье) наиболее полезен по вашему мнению (будет использоваться вами наиболее часто). А также привести обоснование своего мнения.
P.S. Тут нет правильных ответов, но данная активность позволит лучше изучить класс.
Решить небольшую простенькую задачку для закрепления материала.
У нас есть два числа:
1100001001 — в двоичной системе счисления
33332 — в пятеричной системе счисленияНеобходимо используя только методы класса Integer определить максимум среди двух данных чисел, а затем вывести разницу между максимальным и минимальным значением в троичной системе счисления.
Перевести максимально возможное значение Integer в восьмеричную систему счисления и вывести на экран количество цифр в полученном числе (количество считать программно).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ