1. Клас Integer
Integer гарний ще й тим, що це клас, а отже, він може мати поля й методи. І, звичайно, він їх має. Навіть багато — кілька десятків. Тому ми розглянемо основні з них.
Клас Integer має два поля, що містять максимальне й мінімальне значення змінної типу int:
| Поле | Опис |
|---|---|
|
Максимальне значення змінної типу int |
|
Мінімальне значення змінної типу int |
Інколи хочеться присвоїти змінній найменше чи найбільше значення типу int. Щоб не захаращувати код незрозумілими константами, можна ось так красиво написати:
| Код | Опис |
|---|---|
|
|
Крім того, клас Integer має кілька цікавих методів. От вони:
| Методи | Опис |
|---|---|
|
Повертає рядок — шістнадцяткове подання числа |
|
Повертає рядок — двійкове подання числа |
|
Повертає рядок — вісімкове подання числа |
|
Обгортає переданий int класом Integer |
|
Повертає число після перетворення рядка |
Раніше ви вже стикалися зі статичним методом Integer.parseInt(). Нагадаємо, як він працює:
int ім'я = Integer.parseInt(рядок);
Якщо в метод parseInt() передати рядок, який містить число (тільки цифри), то метод розпарсить цей рядок і поверне число, що в ньому міститься.
Решта методів також корисні. Наприклад, деякі з них можуть перетворювати передане число в рядок із двійковим, вісімковим або шістнадцятковим записом числа.
2. Клас Double
Клас Double загалом подібний до класу Integer, тільки він є обгорткою не для типу int, а для типу double. У нього теж є цікаві для нас поля й методи. Розгляньмо деякі з них:
Цікавих полів у класу Double шість:
| Поле | Опис |
|---|---|
|
Мінус нескінченність |
|
Плюс нескінченність |
|
Мінімальне значення експонента (2x) |
|
Максимальне значення експонента (2x) |
|
Мінімальне значення типу double |
|
Максимальне значення типу double |
Нескінченність
Якщо ви поділите -1.0 на 0.0, отримаєте від'ємну нескінченність; якщо 1.0 на 0.0 — додатну нескінченність. Змінні типу double можна не тільки ділити на нуль, але й зберігати в них такі значення.
Експонент числа double
З експонентом (показником степеня) теж усе просто. Число double усередині складається з мантиси й експонента. Тільки от наше значення числа — це не 10х, а 2х. Якщо експонент зросте на 1, значення числа збільшиться вдвічі.
MIN_EXPONENT == -1024, у результаті отримуємо 2-1024, що приблизно дорівнює 10-308
Double також має цікаві методи:
| Методи | Опис |
|---|---|
|
Повертає рядок — шістнадцяткове подання числа |
|
Перевіряє, чи є передане число нескінченністю |
|
Перевіряє, чи є передане число NaN |
|
Обгортає переданий double класом Double |
|
Повертає число після перетворення рядка |
З цікавого можна відзначити наявність методу isInfinite(), який повертає true, якщо передане в нього число — плюс або мінус нескінченність.
Подібним чином працює й метод isNaN() — перевіряє, чи є передане в нього число NaN — спеціальною константою, що позначає невизначеність (Not a Number, Не число).
3. Клас Character
Клас Character цікавий насамперед великою кількістю утилітних статичних методів, які дають змогу перевіряти символи на належність до різних категорій.
Приклади
| Методи | Опис |
|---|---|
|
Перевіряє, чи є символ символом алфавіту |
|
Чи є символ літерою |
|
Чи є символ цифрою |
|
Чи є символ пробілом, символом розриву рядка або символом кінця абзацу (коди: 12, 13, 14) |
|
Чи є символ роздільником: пробіл, tab тощо |
|
Символ у нижньому регістрі — малі літери? |
|
Символ у верхньому регістрі — великі літери? |
|
Перетворює символ у нижній регістр |
|
Перетворює символ у верхній регістр |
Ці методи мають особливість: вони працюють з усіма відомими алфавітами, тобто, наприклад, символи арабських цифр визначатимуться як цифри і т. п.
4. Клас Boolean
Клас Boolean дуже схожий на тип boolean. Різниця мінімальна.
Нижче ми наведемо спрощений варіант класу Boolean:
| Код | Опис |
|---|---|
|
Константи: TRUE і FALSE Змінна-значення Конструктор класу Boolean Метод повертає значення внутрішньої змінної-значення Цей статичний метод уміє перетворювати true на TRUE і false на FALSE. |
Клас Boolean має дві константи (два поля):
| Константи класу | Аналог типу boolean | Опис |
|---|---|---|
|
|
істина |
|
|
хибність |
Працювати з ними можна так само, як і з типом boolean:
| Код | Примітка |
|---|---|
|
Boolean — єдиний клас, який можна писати всередині умови |
|
Усі три змінні дорівнюють true/TRUE |
|
Константи можна порівнювати і за допомогою equals, і за допомогою == Так теж працюватиме. |
Autoboxing тут працює відмінно, тож можете користуватися цим класом так само, як типом boolean: ніяких підводних каменів тут немає.
| Як записано | Як це працює |
|---|---|
|
|
А от як відбуваються порівняння між типом 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:
| Код | Примітка |
|---|---|
|
Скомпілюється і працюватиме |
Скомпілюється, але не працюватиме:
| Код | Примітка |
|---|---|
|
Помилка. У цьому рядку буде кинуто виняток |
5. Кешування значень під час операції autoboxing
А от із класами-обгортками для цілочислових типів підводні камені є.
Як вам уже відомо, коли ви порівнюєте int і Integer, Integer перетворюється на int:
| Як записано | Як це працює |
|---|---|
|
|
Якщо порівняти між собою два об'єкти класу Integer, перетворюватися на тип int вони не будуть:
| Код | Виведення на екран |
|---|---|
|
|
Хоч a == c і b == c, але a != b, оскільки для порівняння a і b порівнюються посилання. І цього, в принципі, слід було очікувати.
Сюрприз
А от якщо ми замінимо 500 на 100, отримаємо зовсім інший результат:
| Код | Виведення на екран |
|---|---|
|
|
Річ у тім, що під час 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) є константами: по суті, теж кешуються.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ