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() передати рядок, який містить число (тільки цифри), то метод розпарсить цей рядок і поверне число, що в ньому міститься.

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


12
Задача
Модуль 1. Java Syntax,  22 рівень2 лекція
Недоступна
Скорочуємо try
Програма читає з консолі рядок і виводить його на екран у нижньому регістрі. Не змінюючи функцій програми, перепиши код із використанням try-with-resources. Візьми в круглі дужки створення об'єктів із зовнішніми ресурсами. Не забудь видалити непотрібні виклики методу close().

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, Не число).


12
Задача
Модуль 1. Java Syntax,  22 рівень2 лекція
Недоступна
Повернення до витоків
Програма читає з консолі рядок і виводить його на екран у нижньому регістрі. Однак, виявляється, вона не працюватиме на старих версіях Java (нижче 7-ї версії). Не змінюючи функцій програми, заміни блок try-with-resources на звичайний try-catch.Не забудь про виклик методу close() для об'єктів із зовн

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)
Перетворює символ у верхній регістр

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


12
Задача
Модуль 1. Java Syntax,  22 рівень2 лекція
Недоступна
Коли ресурсів багато
Програма зчитує з консолі шлях до файлу, читає рядки з файлу й виводить їх на екран.Перепиши код програми з використанням try-with-resources: візьми в круглі дужки створення об'єктів із зовнішніми ресурсами. Не забудь видалити непотрібний блок finally й виклики методу close().

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