1. Клас Integer

Integer гарний ще й тим, що це клас, а отже, він може мати поля й методи. І, звичайно, він їх має. Навіть багато — кілька десятків. Тому ми розглянемо основні з них.

Клас Integer має два поля, що містять максимальне й мінімальне значення змінної типу int:

Поле Опис
Integer.MAX_VALUE
Максимальне значення змінної типу int
Integer.MIN_VALUE
Мінімальне значення змінної типу int

Інколи хочеться присвоїти змінній найменше чи найбільше значення типу int. Щоб не захаращувати код незрозумілими константами, можна ось так красиво написати:

Код Опис
int min = Integer.MIN_VALUE;
min == 0x80000000

Крім того, клас Integer має кілька цікавих методів. От вони:

Методи Опис
String Integer.toHexString(int)
Повертає рядок — шістнадцяткове подання числа
String Integer.toBinaryString(int)
Повертає рядок — двійкове подання числа
String Integer.toOctalString(int)
Повертає рядок — вісімкове подання числа
Integer Integer.valueOf(int i)
Обгортає переданий int класом Integer
Integer Integer.parseInt(String)
Повертає число після перетворення рядка

Раніше ви вже стикалися зі статичним методом Integer.parseInt(). Нагадаємо, як він працює:

int ім'я = Integer.parseInt(рядок);

Якщо в метод parseInt() передати рядок, який містить число (тільки цифри), то метод розпарсить цей рядок і поверне число, що в ньому міститься.

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



2. Клас Double

Клас Double загалом подібний до класу Integer, тільки він є обгорткою не для типу int, а для типу double. У нього теж є цікаві для нас поля й методи. Розгляньмо деякі з них:

Цікавих полів у класу Double шість:

Поле Опис
double Double.NEGATIVE_INFINITY
Мінус нескінченність
double Double.POSITIVE_INFINITY
Плюс нескінченність
int Double.MIN_EXPONENT
Мінімальне значення експонента (2x)
int Double.MAX_EXPONENT
Максимальне значення експонента (2x)
double Double.MIN_VALUE
Мінімальне значення типу double
double Double.MAX_VALUE
Максимальне значення типу double

Нескінченність

Якщо ви поділите -1.0 на 0.0, отримаєте від'ємну нескінченність; якщо 1.0 на 0.0 — додатну нескінченність. Змінні типу double можна не тільки ділити на нуль, але й зберігати в них такі значення.

Експонент числа double

З експонентом (показником степеня) теж усе просто. Число double усередині складається з мантиси й експонента. Тільки от наше значення числа — це не 10х, а 2х. Якщо експонент зросте на 1, значення числа збільшиться вдвічі.

MIN_EXPONENT == -1024, у результаті отримуємо 2-1024, що приблизно дорівнює 10-308

Double також має цікаві методи:

Методи Опис
String Double.toHexString(double)
Повертає рядок — шістнадцяткове подання числа
boolean Double.isInfinite(double)
Перевіряє, чи є передане число нескінченністю
boolean Double.isNaN(double)
Перевіряє, чи є передане число NaN
Double Double.valueOf(double)
Обгортає переданий double класом Double
Double Double.parseDouble(String)
Повертає число після перетворення рядка

З цікавого можна відзначити наявність методу isInfinite(), який повертає true, якщо передане в нього число — плюс або мінус нескінченність.

Подібним чином працює й метод isNaN() — перевіряє, чи є передане в нього число NaN — спеціальною константою, що позначає невизначеність (Not a Number, Не число).



3. Клас Character

Клас Character цікавий насамперед великою кількістю утилітних статичних методів, які дають змогу перевіряти символи на належність до різних категорій.

Приклади

Методи Опис
Character.isAlphabetic(int)
Перевіряє, чи є символ символом алфавіту
Character.isLetter(char)
Чи є символ літерою
Character.isDigit(char)
Чи є символ цифрою
Character.isSpaceChar(char)
Чи є символ пробілом, символом розриву рядка або символом кінця абзацу (коди: 12, 13, 14)
Character.isWhitespace(char)
Чи є символ роздільником: пробіл, tab тощо
Character.isLowerCase(char)
Символ у нижньому регістрі — малі літери?
Character.isUpperCase(char)
Символ у верхньому регістрі — великі літери?
Character.toLowerCase(char)
Перетворює символ у нижній регістр
Character.toUpperCase(char)
Перетворює символ у верхній регістр

Ці методи мають особливість: вони працюють з усіма відомими алфавітами, тобто, наприклад, символи арабських цифр визначатимуться як цифри і т. п.



4. Клас Boolean

Клас Boolean дуже схожий на тип boolean. Різниця мінімальна.

Нижче ми наведемо спрощений варіант класу Boolean:

Код Опис
class Boolean
{
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);

   private final boolean value;

   public Boolean(boolean value)
   {
      this.value = value;
   }

   public boolean booleanValue()
   {
      return value;
   }

   public static Boolean valueOf(boolean value)
   {
      return (value ? TRUE : FALSE);
   }
}


Константи: TRUE і FALSE


Змінна-значення

Конструктор класу Boolean




Метод повертає значення внутрішньої змінної-значення



Цей статичний метод уміє перетворювати true на TRUE і false на FALSE.

Клас Boolean має дві константи (два поля):

Константи класу Аналог типу boolean Опис
Boolean.TRUE
true
істина
Boolean.FALSE
false
хибність

Працювати з ними можна так само, як і з типом boolean:

Код Примітка
if (Boolean.TRUE)
{
}
Boolean — єдиний клас, який можна писати всередині умови
Boolean a = Boolean.TRUE;
boolean b = Boolean.TRUE;
boolean с = true;
Усі три змінні дорівнюють true/TRUE
Boolean a = Boolean.TRUE;
Boolean b = Boolean.TRUE;
if (a == b)
Константи можна порівнювати і за допомогою equals, і за допомогою ==

Так теж працюватиме.

Autoboxing тут працює відмінно, тож можете користуватися цим класом так само, як типом boolean: ніяких підводних каменів тут немає.

Як записано Як це працює
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

А от як відбуваються порівняння між типом 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:

Код Примітка
Boolean less = (2 < 3);
if (less)
{
   ...
}
Скомпілюється і працюватиме

Скомпілюється, але не працюватиме:

Код Примітка
Boolean less = null;
if (less)
{
   ...
}

Помилка. У цьому рядку буде кинуто виняток


5. Кешування значень під час операції autoboxing

А от із класами-обгортками для цілочислових типів підводні камені є.

Як вам уже відомо, коли ви порівнюєте int і Integer, Integer перетворюється на int:

Як записано Як це працює
int a = 5;
Integer b = 5;
if (a == b)
{
   ...
}
int a = 5;
Integer b = Integer.valueOf(5);
if (a == b.intValue())
{
   ...
}

Якщо порівняти між собою два об'єкти класу Integer, перетворюватися на тип int вони не будуть:

Код Виведення на екран
Integer a = 500;
Integer b = 500;
int c = 500;

System.out.println(a == b); // порівняння посилань
System.out.println(a == c);
System.out.println(b == c);




false
true
true

Хоч a == c і b == c, але a != b, оскільки для порівняння a і b порівнюються посилання. І цього, в принципі, слід було очікувати.

Сюрприз

А от якщо ми замінимо 500 на 100, отримаємо зовсім інший результат:

Код Виведення на екран
Integer a = 100;
Integer b = 100;
int c = 100;

System.out.println(a == b); // порівняння посилань
System.out.println(a == c);
System.out.println(b == c);




true
true
true

Річ у тім, що під час 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) є константами: по суті, теж кешуються.