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
) є константами: по суті, теж кешуються.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ