JavaRush/Java блог/Random UA/Посібник з класу Java Integer

Посібник з класу Java Integer

Стаття з групи Random UA
учасників
У цій статті ми поговоримо про клас Integer. Розглянемо такі питання:
  • що таке класи-обгортки;
  • автоупаковка/розпакування примітивів;
  • робота класу Integer, його методи та константи.
Посібник з класу Java Integer - 1

Класи-обгортки примітивних типів

Як відомо, Java має різні типи даних, які умовно можна розділити на два блоки:
  • примітивні;
  • посилальні.
Примітивних типів даних у Java кілька:
  • цілі числа - byte, short, int, long;
  • числа з плаваючою точкою (речові) - float, double;
  • логічний тип даних - boolean;
  • символьний тип даних – char.
У кожного примітивного типу даних є свій клас-обгортка. Посилальний тип даних, який "обертає" свого примітивного молодшого брата Java-об'єкт. Нижче наведено примітивні типи даних та відповідні їм класи обгортки:
Примітивний тип Клас обгортка
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
У практичному сенсі у примітивів та їх класів-оберток багато спільного. Більшість операцій виконуються ідентично. Однак у класів-оберток є ряд характеристик, не властивих примітивам. По-перше, це класи: при роботі з класами-обгортками ми працюємо з об'єктами. По-друге (все наступне випливає з пункту по-перше), ці об'єкти можуть бути null. По-третє класи-обгортки надають низку констант та методів, що спрощують роботу з певним типом даних. У цій статті ми розглянемо детальніше роботу з класом Integer.

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 = 6;
Integer b = 2;
Integer c = a + b;
System.out.println(c); // 8
Віднімати

Integer a = 6;
Integer b = 2;
Integer c = a - b;
System.out.println(c); // 4
Примножувати

Integer a = 6;
Integer b = 2;
Integer c = a * b;
System.out.println(c); // 12
Ділити

Integer a = 6;
Integer b = 2;
Integer c = a / b;
System.out.println(c); // 3
Інкрементувати

Integer a = 6;
a++;
++a;
System.out.println(a); // 8
Декрементувати

Integer a = 6;
a--;
--a;
System.out.println(a); // 4
Але при цьому необхідно бути обережним і пам'ятати, що Integer - це тип посилання даних, і змінна цього типу може бути null. У разі (якщо змінна дорівнює null) краще утриматися від арифметичних операцій (та й будь-яких інших, у яких null нічого хорошого не обіцяє). Наведемо приклад:
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” ми створабо новий об'єкт). Наведемо ще один цікавий приклад:
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)
Даний метод перетворює String на int. Продемонструємо роботу даного методу:
int i = Integer.parseInt("10");
System.out.println(i); // 10
Якщо перетворення неможливо - наприклад, ми передали слово метод parseInt - буде кинуто виняток NumberFormatException. У методу parseInt(String s) є перевантажений побратим:
  • 
    static int parseInt(String s, int radix)
Цей метод перетворює параметр s в int. У параметрі radix вказується, в якій системі числення спочатку записано число s, яке необхідно перетворити в int. Приклади нижче:
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
Однак, як і не статичний метод доString, використання статичного у явному вигляді можна зустріти рідко. Цікавіший статичний метод 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 класу, а також деякі константи. Навели приклади переведення чисел з однієї системи числення до іншої.

Домашнє завдання

  1. Вивчити, які ще є методи класу Integer (вивчати можна на сайті з офіційною документацією ), написати в коментарях, який із вивчених вами методів (без урахування тих, що наведені в статті) найбільш корисний на вашу думку (використовуватиметься вами найчастіше). А також навести обґрунтування своєї думки.

    PS Тут немає правильних відповідей, але ця активність дозволить краще вивчити клас.

  2. Вирішити невелике просте завдання для закріплення матеріалу.

    У нас є два числа:

    1100001001 - у двійковій системі числення
    33332 - у п'ятирічній системі числення

    Необхідно, використовуючи лише методи класу Integer, визначити максимум серед двох даних чисел, а потім вивести різницю між максимальним і мінімальним значенням у трійковій системі числення.

  3. Перевести максимально можливе значення Integer у вісімкову систему числення та вивести на екран кількість цифр в отриманому числі (кількість рахувати програмно).

Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.