JavaRush /Курси /Java Syntax Zero /Примітивні типи в Java

Примітивні типи в Java

Java Syntax Zero
Рівень 8 , Лекція 1
Відкрита

1. Список примітивних типів

У Java є 8 базових примітивних типів. Примітивними їх називають тому, що значення цих типів не є об'єктами і зберігаються прямо всередині змінних.

Ось таблиця, яка містить коротку інформацію про ці типи:

Тип Розмір,
байт
Діапазон значень Значення за замовчуванням Опис
byte 1 -128 .. 127 0 Найменше ціле — один байт
short 2 -32,768 .. 32,767 0 Коротке ціле, два байти
int 4 -2*109 .. 2*109 0 Ціле число, 4 байти
long 8 -9*1018 .. 9*1018 0L Довге ціле, 8 байтів
float 4 -1038 .. 1038 0.0f Дробове, 4 байти
double 8 -10308 .. 10308 0.0d Дробове, подвійної довжини, 8 байтів
boolean 1 true, false false Логічний тип (тільки true & false)
char 2 0 .. 65,535 '\u0000' Символи, 2 байти, все більше 0
Значення за замовчуванням

До речі, важливий момент. Якщо ви оголосили змінну-класу (поле класу) або статичну змінну-класу, і не присвоїли їй жодного значення, вона ініціалізується значенням за замовчуванням. Список таких значень наведено у таблиці.

Локальні змінні методів не мають значень за замовчуванням, і якщо ви не присвоїли такій змінній жодного значення, вона вважається не ініціалізованою і використати її значення неможливо.

Але давайте повернемося до примітивних типів і розглянемо їх детальніше



2. Цілі типи

У мові Java аж 4 цілі типи: byte, short, int і long. Вони відрізняються розміром і діапазоном значень, які можуть зберігати.

Тип int

Найбільш часто використовуваним є тип int. Його назва походить від Integer (цілий). Усі цілочисельні літерали в коді мають тип int (якщо в кінці числа не вказана літера L, F або D).

Змінні цього типу можуть приймати значення від -2,147,483,648 до +2,147,483,647.

Цього досить багато і вистачає майже для всіх випадків життя. Майже всі функції, які повертають число, повертають число типу int.

Приклади:

Код Пояснення
int n = "Рядок".length();
Метод length() повертає довжину рядка
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Поле length містить довжину масиву.

Тип short

Тип short отримав свою назву від short int. Його ще називають коротке ціле. На відміну від типу int, його довжина всього два байти і можливий діапазон значень від -32,768 до +32,767.

Тобто в ньому навіть число мільйон не збережеш. Навіть 50 тисяч. Це найрідше використовуваний цілочисельний тип у Java. В основному його використовують, коли хочуть заощадити на пам'яті.

Припустимо, у вас ситуація, коли заздалегідь відомо, що значення з якими ви працюєте не перевищуватимуть 30 тисяч, і таких значень мільйони.

Наприклад, ви пишете застосунок, який обробляє картинки надвисокої якості: на один колір припадає 10 біт. А точок у вас у картинці — мільйон. І отут уже відіграє роль, використовуєте ви тип int чи short.

Тип long

Цей тип отримав свою назву від long int — його ще називають довге ціле. На відміну від типу int, у нього просто гігантський діапазон значень: від -9*1018 до +9*1018

Чому ж він не є основним цілим типом?

Уся справа в тому, що Java з'явилася ще в середині 90-х, коли більшість комп'ютерів були 32-бітними. А це означало, що всі процесори були заточені під роботу з числами із 32 біт. З цілими числами із 64 біт процесори працювати вже вміли, але операції з ними були повільнішими.

Тому програмісти розумно вирішили зробити стандартним цілим типом тип int, ну а тип long використовувати тільки тоді, коли без нього дійсно не обійтися.

Тип byte

Це найменший цілочисельний тип у Java, але далеко не найрідше використовуваний. Його назва збігається зі словом byte — мінімальна адресована комірка пам'яті в Java.

Розмір допустимих значень типу byte не такий вже й великий: від -128 до +127. Але не в цьому його сила. Тип byte найчастіше використовується, коли потрібно зберігати в пам'яті великий блок знеособлених даних. Масив типу byte просто ідеально підходить для цих цілей.

Наприклад, вам потрібно кудись скопіювати файл.

Вам не потрібно обробляти вміст файлу: ви просто хочете створити область пам'яті (буфер), скопіювати в неї вміст файлу, а потім записати ці дані з буфера в інший файл. Масив типу byte — те, що потрібно для цих цілей.

Тим більше, що в змінній-типу-масив зберігається тільки посилання на область пам'яті. При передачі значення цієї змінної в якийсь метод відбудеться тільки передача адреси в пам'яті, а сам блок пам'яті копіюватися не буде.

byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
   int size = sourceFile.read(buffer);   // читаємо дані з файлу в буфер
   destFile.write(buffer, 0, size);      // записуємо дані з буфера в файл

   // припиняємо копіювання, якщо буфер заповнений не повністю
   if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();


3. Дробові типи

Серед примітивних типів також є два дробові. Хоча це не зовсім точна назва. Офіційно вони називаються числа з плаваючою точкоюfloating point numbers. Назва походить із стандарту, коли цілу і дробову частину числа розділяє точка (а не кома).

Корисно:

У кожній країні свої стандарти для запису чисел (раптом!).

Багато з нас звикли писати точки для розділення тисяч і кому для відокремлення дробової частини: наприклад, мільйон цілих і 153 тисячних ми б записали так 1.000.000,153. А ось у США, де жили творці Java, прийнятий інший стандарт: 1,000,000.153

У Java є два примітивних типи з плаваючою точкою: double і float.

Як ми вже казали раніше, ці типи всередині влаштовані специфічним чином: фактично всередині кожної змінної цих типів знаходиться не одне число, а два:

Наприклад, дробове число 987654.321 можна представити як 0.987654321*106. Тому в пам'яті воно буде представлено як два числа 987654321 (мантиса — значуща частина числа) і 6 (показник — ступінь десятки)

Тип float

Сама назва типу float походить від floating point number. Розмір цього типу зовсім невеликий — лише 4 байти (32 біти), але він може зберігати значення від -3.4*1038 до 3.4*1038. На мантису віддається 24 біти, на показник — 8 біт. Цей тип здатний зберігати лише 8 значущих цифр.

Такий підхід дозволяє зберігати набагато більші числа, ніж int, використовуючи ті ж 4 байти. Але при цьому ми жертвуємо точністю. Частина пам'яті витрачається на зберігання мантиси, тому такі числа зберігають лише 6-7 знаків після коми, інші відкидаються.

Приклад:

Код Значення змінної
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

Як бачите, основний недолік цього типу — дуже маленька кількість значущих цифр і втрата точності вже у восьмій цифрі. Тому тип float не надто популярний серед Java-програмістів.

Тип double

Тип double є стандартним типом з плаваючою точкою. Його назва походить від double floating point. Його ще називають числом з плаваючою точкою подвійної точності. Усі дробові літерали за замовчуванням мають тип double.

Цей тип займає 8 байтів пам'яті (64 біти) і може зберігати значення від -1.7*10308 до 1.7*10308. Важливим моментом є те, що на його мантису виділяється 53 біти, а решта 11 — на показник.

Це дозволяє зберігати 15-17 значущих цифр.

Приклад:

Код Значення змінної
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Така точність, особливо у порівнянні з типом float, є визначальною: 99% усіх операцій з дробовими числами виконуються з типом double.

На показник виділяється 11 біт, що дозволяє зберігати ступінь десятки від -323 до +308 (ступінь двійки — від -1024 до +1023). Тип double легко може зберігати число із сотнею нулів після коми:

Код Значення змінної
double a = 2E-300 * 3E+302
600.0


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

Числа з плаваючою точкою мають ще одну цікаву особливість: вони дозволяють зберігати спеціальне значення, що позначає нескінченність. Причому може бути позитивна нескінченність і негативна нескінченність.

Приклади:

Код Примітка
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

Якщо нескінченність помножити на число, вийде нескінченність. Якщо до нескінченності додати число, вийде нескінченність. Дуже зручно.

Не число (NaN)

Будь-які операції з нескінченністю дають нескінченність. Загалом так, але не завжди.

Числа з плаваючою точкою можуть зберігати ще одне спеціальне значення — NaN. Це скорочення від Not a Number (не число).

У математиці, якщо поділити нескінченність на нескінченність, повинна виникнути невизначеність.

Ну, а в Java, якщо поділити нескінченність на нескінченність, буде NaN.

Приклади:

Код Примітка
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

Будь-яка операція з NaN дає NaN.



5. Тип char

Серед примітивних типів у Java є ще один, який заслуговує на особливу увагу — тип char. Його назва походить від слова Character, а сам тип використовується для того, щоб зберігати символи.

Адже символи — це саме те, з чого складаються рядки: кожний рядок містить у собі масив символів.

Але ще цікавіше те, що тип char — це і числовий тип теж! Так би мовити, тип подвійного призначення.

Вся справа в тому, що насправді тип char зберігає не символи, а коди символів з кодування Unicode. Кожному символу відповідає число — числовий код символу.

Кожна змінна типу char займає в пам'яті два байти (як і тип short). Але на відміну від типу short, цілий тип char — беззнаковий, і може зберігати значення від 0 до 65,535.

Тип char — гібридний тип. Його значення можна інтерпретувати і як числа (їх можна додавати і множити), і як символи. Так було зроблено тому, що хоч символи і мають візуальне представлення, для комп'ютера вони в першу чергу просто числа. І працювати з ними як з числами набагато зручніше.

Unicode

Unicode — це спеціальна таблиця (кодування), яка містить усі символи світу. І у кожного символу є свій номер. Виглядає вона приблизно так:

Примітивні типи в Java

Присвоїти значення змінній типу char можна різними способами.

Код Опис
char a = 'A';
Змінна а буде містити латинську букву А.
char a = 65;
Змінна а буде містити латинську букву А. Її код якраз 65.
char a = 0x41;
Змінна а буде містити латинську букву А.
Її код якраз 65, що дорівнює 41 у шістнадцятковій системі.
char a = 0x0041;
Змінна а буде містити латинську букву А.
Її код якраз 65, що дорівнює 41 у шістнадцятковій системі.
Два зайвих нуля нічого не змінюють.
char a = '\u0041';
Змінна а буде містити латинську букву А.
Ще один спосіб задати символ за його кодом.

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

І як ми говорили, тип char — це і цілий тип теж, тому можна написати так:

Код Вивід на екран
char a = 'A';
a++;
System.out.println(a);
На екран буде виведена латинська буква B.
Тому що:
A65
B66
C67

Робота з типом char

Кожний символ char — це в першу чергу число (код символу), а потім вже символ. Знаючи код символу, завжди можна отримати його в програмі. Приклад:

Код Вивід на екран
char c = (char) 1128;
System.out.println(c);

Ѩ

Стандартні коди

Ось найвідоміші коди символів:

Символи Коди
0, 1, 2, ... 9 48, 49, 50, ... 57
a, b, c, ... z 97, 98, 99, ... 122
A, B, C, ... Z 65, 66, 67, ... 90


6. Тип boolean

І останній примітивний тип — це boolean.

Як ти вже знаєш, він може приймати лише два значення: true та false.

Власне, все, що потрібно знати про цей тип, ти вже знаєш.

Коментарі (21)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
IronMan57 Рівень 28
26 листопада 2024
Хтось знає, як за допомогою данних типу char вивести на екран українські букви 'І', 'і', 'Ґ', 'ґ'? З буквами 'Є' та 'Ї' ніяких проблем немає. Вони мають в Юнікод в шістнадцятиричній системі коди 404 та 407, і нормально виводяться на екран. А от при спробі вивести на екран букви 'і' та 'ґ', хоча вони і є в таблиці Юнікод під шістнадцятиричними кодами 456 та 491 відповідно, я отримав символи '?'. Наскільки, я зрозумів, це означає, що система не може відобразити відповідний символ.
Jaroslav Рівень 48
27 листопада 2024

char aChar = 'ї';
System.out.println(aChar);
нормально виводить 'і' та 'ї' Подивись в налаштуваннях який всталовлено шрифт. В мене JetBrains Mono
IronMan57 Рівень 28
26 листопада 2024
Одне, як мені здається, цікаве спостереження. При виконанні вправ про найменші цілі числа спробував задавати їх як добутки, поскільки це завжди якісь степені двійки. Наприклад, найменший int: int k = -1024 * 1024 * 1024 * 2; чи найменший short: short j = -32 * 1024; І такий підхід спрацьовував, та приймався системою за правильну відповідь. Але з типом long такий фокус не пройшов. Задавши long smallestLong = -1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 8; після виводу цього числа на екран отримав число -1. Причиною, як виявилось було те, що коли в коді ціле число задається саме у виді числа (1; 1024; 32768), то за замовчуванням воно має тип int. Перемноживши кілька разів 1024 саме на себе, ми виходимо за межі діапазону доступного для типу int, і замість великого цілого числа отримуємо -1. Але через добуток також можна отримати велике ціле число, вказавши явно, що воно має бути не типу int, а типу long. Зробити це можна додавши хоча б до одного з множників букву L. Ось таким чином: long smallestLong = -1024L * 1024 * 1024 * 1024 * 1024 * 1024 * 8; Майте на увазі, що в результаті операцій додавання, чи множення позитивних чисел, можна в наслідку переповнення отримати негативний результат.
Jaroslav Рівень 48
27 листопада 2024
Але з типом long такий фокус не пройшов. Задавши long smallestLong = -1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 8; Бо всі введені числа int і переповнення сталося задовго до максимального long Спробуй так:

System.out.println(-1024l * 1024 * 1024 * 1024 * 1024 * 1024 * 8);
bogdan kravchuk Рівень 11
9 березня 2023
вже пішов 2 місяць мого навчання) а точніше місяць і тиждень. по 2 години в день😅 в суботу неділю 3. А ти скільки навчаєшся?😉
Valerii Рівень 33 Expert
23 квітня 2023
Хай друже,як далі навчання)?
Ва Дим Рівень 28
20 березня 2024
йду все занов.Перший раз дібрався до 25 рівня .Тепер повторюю і збираюсь вже вище.На багато вище
Dmytro Рівень 26
23 червня 2024
Учеба закончилась?)
kivi Рівень 20
26 січня 2023
в останній задачі достатньо запустити код який дає джавараш, і через output зрозуміло який символ в якій змінній
Anonymous #696530 Рівень 19
27 липня 2022
Дещо пригальмував на експонентах, а так завдання в цій лекції легкі. По char задача найцікавіша.
Roma Chernesh Рівень 16
19 грудня 2022
Мені навпаки найбільш зайшла задача про ексоненти. Так мозок не міг вкумекати, що це за така Мантиса така. Але як гарно погуглив, то все стало зрозуміло:)
Viacheslav B. Рівень 1
5 лютого 2024
також прийшлося гугллити , схоже що я пропустив це у школьной программе ) але поки що задачу не вирішив ( спробую повернутися пізніше
Anonymous #3107519 Рівень 10
20 липня 2022
Я також
Александр Рівень 12
2 листопада 2021
я все еще учусь)
Taras Woytowitch Рівень 16
4 січня 2022
і я
Ольга Рівень 33
11 лютого 2022
и я
Anonymous #3026165 Рівень 11
8 червня 2022
И я)
Ира Оксак Рівень 11
15 серпня 2022
и я))
Oleksii Pliukhin Рівень 13
21 січня 2023
и я
Nicky^^ Рівень 32
1 лютого 2023
І я
Женя Иващенко Рівень 32
22 лютого 2023
І я)