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