Java: Які бувають типи
У цьому уроці ми розглянемо систему типів Java з висоти пташиного польоту, не занурюючись у деталі. Але спершу відповімо на запитання, навіщо взагалі про них знати?
У коді ми постійно оперуємо даними. Ці дані мають різну природу, можуть бути по-різному організовані, що впливає зручність роботи з ними. Типи переслідують нас на кожному кроці, тому без них програмування на Java можливе лише на базовому рівні.
З іншого боку, не намагайтеся запам'ятати всю цю інформацію про типи напам'ять - вона дається лише для загального уявлення. Все важливе про типи ви й так вивчите у процесі програмування. Глобально, типи даних у Java поділяються на дві великі групи:
- Примітивні — зумовлені Java
- Посилання або не примітивні — створюються самим програмістом, крім String і Array
Ці групи мають відмінності, які ми розберемо пізніше, коли познайомимося з null і объектно-ориентированным програмуванням. Поки що досить знати, що імена примітивних типів починаються з нижнього регістру ( int ), а посилальних з верхнього ( String ).
Усього в Java вісім примітивних типів даних:
Розглянемо перші чотири типи. Це цілі числа різного розміру:
- byte - Займає в пам'яті 1 байт, значить може зберігати числа від -128 до 127
- short - Займає в пам'яті 2 байти
- int - Займає в пам'яті 4 байти
- long - Займає в пам'яті 8 байт
Подивимося на прикладі такого коду:
byte x = 3; // Відпрацює без проблем // Error: incompatible types: possible lossy conversion from int to byte byte y = 270;
Визначення змінної y завершилося з помилкою, тому що ми вказали тип byte, але надали змінної значення 270що виходить за безліч допустимих значень.
Виникає закономірне питання. Навіщо аж чотири типи для зберігання чисел?
Технічно так зробити можна, але ми знаходимося в світі інженерних рішень. У будь-якого рішення завжди є зворотний бік, тому неможливо зробити ідеально - доведеться чимось пожертвувати. long, то програма, що активно оперує числами, почне займати занадто багато місця в оперативній пам'яті, що може бути критично.
Така сама логіка використовувалася для типів float і doubleВони обидва відповідають за раціональні числа. double - це подвійний floatтобто в пам'яті він займає вдвічі більше місця.
Творці Java покладаються на розумність програмістів, на їхню здатність правильно підібрати потрібні типи в залежності від задачі. int для цілих чисел та double для раціональних.
Розглянемо типи даних, що залишилися.
Тип boolean відповідає за логічні значення true та false . Їм присвячений цілий розділ, там ми про нього і поговоримо.
Окремо стоїть тип char - Символ. Це не рядок, у нього інший спосіб визначення - через одиночні лапки:
char ch = 'a'; // Error: incompatible types: java.lang.String cannot be converted to char char ch2 = "b";
Рядок, що складається з одного символу — це не символ.
Витяг символу з рядка витягує якраз символ, а не рядок, що складається з одного символу:
Добре, а де тип даних String - Рядок? Справа в тому, що вона не є примітивним типом. Усередині вона є масивом символів. Незважаючи на цю технічну відмінність, рядки використовуються нарівні з примітивними типами без особливих відмінностей.
Завдання
Виведіть на екран результат конкатенації слова hexlet, символу - та числа 7
Якщо ви зайшли в глухий кут, то саме час поставити питання в «Обговореннях». Як правильно поставити запитання:
- Обов'язково докладіть виведення тестів, без нього практично неможливо зрозуміти, що не так, навіть якщо ви покажете свій код. Програмісти погано виконують код у голові, але за помилкою майже завжди зрозуміло, куди дивитися.
Тести влаштовані таким чином, що вони перевіряють рішення різними способами та на різних даних. Часто рішення працює з одними вхідними даними, але з іншими. Щоб розібратися з цим моментом, вивчіть вкладку «Тести» та уважно подивіться на виведення помилок, у якому є підказки.
Це нормально 🙆, у програмуванні одне завдання можна виконати безліччю способів. Якщо ваш код пройшов перевірку, він відповідає умовам завдання.
У поодиноких випадках буває, що рішення підігнано під тести, але це видно відразу.
Створювати навчальні матеріали, зрозумілі всім без винятку, досить складно. Ми дуже намагаємося, але завжди є що покращувати. Якщо ви зустріли матеріал, який вам незрозумілий, напишіть проблему в «Обговореннях». Ідеально, якщо ви сформулюєте незрозумілі моменти як запитань. Зазвичай нам потрібно кілька днів для внесення поправок.
До речі, ви також можете брати участь у покращенні курсів: унизу є посилання на вихідний код уроків, який можна правити прямо з браузера.
Корисне
- Спробуйте пограти з конкатенуванням рядків та символів у jshell
- Стаття про дробові числа
Типи даних та змінні
Однією з основних особливостей Java є те, що ця мова є строго типізованим. І це означає, кожна змінна і константа представляє певний тип і цей тип суворо визначений. Тип даних визначає діапазон значень, які може зберігати змінна або константа.
Базові типи
Отже, розглянемо систему вбудованих базових типів даних, яка використовується для створення змінних Java. А вона представлена такими типами.
boolean: зберігає значення true або false.
boolean
isActive
=
false;
boolean
isAlive
=
true;
byte: зберігає ціле число від -128 до 127 і займає 1 байт
byte
a
=
3;
byte
b
=
8;
short: зберігає ціле число від -32768 до 32767 і займає 2 байти
short
a
=
3;
short
b
=
8;
int : зберігає ціле число від -2147483648 до 2147483647 і займає 4 байти
long : зберігає ціле число від -9223372036854775808 до 9223372036854775807 і займає 8 байт
long
a
=
5;
long
b
=
10;
double : зберігає число з плаваючою точкою подвійної точності (стандарт IEEE 754) і займає 8 байт
double
x
=
8.5;
double
y
=
2.7;
Як роздільник цілої та дробової частини в дробових літералах використовується ТОЧКА.
float : зберігає число з точкою одинарної точності (стандарт IEEE 754) і займає 4 байти
float
x
=
8.5F;
float
y
=
2.7F;
char : зберігає одиночний символ у кодуванні Unicode і займає 2 байти, тому діапазон значень, що зберігаються від 0 до 65536.
При цьому змінна може набувати лише тих значень, які відповідають її типу. Якщо змінна представляє цілий тип, то вона не може зберігати дробові числа.
Цілі числа
Усі цілочисленные літерали, наприклад, 10 , 4 , -5 , сприймаються як значення типу int , проте ми можемо надавати цілочисленні літерали іншим цілочисленним типам: byte , long , short . У цьому випадку Java автоматично здійснює відповідні перетворення:
byte
a
=
1;
short
b
=
2;
long
c
=
2121;
Як правило, значення для цілих змінних задаються в десятковій системі числення, проте ми можемо застосовувати й інші системи числення. Наприклад:
int
num111
=
0x6F;
// шістнадцяткова система, число 111
int
num8
=
010;
// вісімкова система, число 8
int
num13
=
0b1101;
// Двійкова система, число 13
Для завдання шістнадцяткового значення після символів 0x вказується число у шістнадцятковому форматі. Так само вісімкове значення вказується після символу 0 , а двійкове значення - після символів 0b .
Також цілі числа підтримують розділення розрядів числа за допомогою символу підкреслення:
int
x
=
123_456;
int
y
=
234_567__789;
System.out.println(x);
// 123456
System.out.println(y);
// 234567789
Числа з плаваючою точкою
При присвоєнні змінної типу float дробового літералу з плаваючою точкою, наприклад, 3.1, 4.5 і т.д. Java автоматично розглядає цей літерал як значення типу double. Щоб вказати, що це значення має розглядатися як float , нам треба використовувати суфікс f :
float
fl
=
30.6f;
double
db
=
30.6;
І хоча в даному випадку обидві змінні мають практично одне значення, але ці значення по-різному розглядатимуть і займатимуть різне місце в пам'яті.
Посилальні типи
Решта за винятком примітивних. Якщо бути точним, будь-який Object .
Змінні
Для зберігання даних у програмі призначено змінні. Змінна являє собою іменовану область пам'яті, яка зберігає значення певного типу.Кожна змінна має тип, ім'я та значення. Тип визначає, яку інформацію може зберігати змінна чи діапазон допустимих значень.
Змінні оголошуються так:
тип_даних
ім'я_змінної;
Наприклад, визначимо змінну, яка називатиметься x і матиме тип int :
У цьому вся виразі ми оголошуємо змінну x типу int . Тобто x зберігатиме деяке число не більше 4 байт.
Як ім'я змінної може виступати будь-яка довільна назва, яка задовольняє наступним вимогам:
- Ім'я може містити будь-які алфавітно-цифрові символи, а також знак підкреслення, при цьому перший символ у імені не повинен бути цифрою
- в імені не повинно бути знаків пунктуації та пропусків
- ім'я не може бути ключовим словом мови Java
Крім того, при оголошенні та подальшому використанні треба враховувати, що Java - реєстрозалежна моватому наступні оголошення int num; та int NUM; представлятимуть дві різні змінні.
Оголосивши змінну, ми можемо надати їй значень:
int
x;
// оголошення змінної
x
=
10;
// Присвоєння значення
System.out.println(x);
// 10
Також можна надати значення змінної при її оголошенні. Цей процес називається ініціалізацією:
int
x
=
10;
// оголошення та ініціалізація змінної
System.out.println(x);
// 10
Якщо ми не надамо змінної значення до її використання, то ми можемо отримати помилку, наприклад, у наступному випадку:
int
x;
System.out.println(x);
Через кому можна оголосити відразу кілька змінних одного типу:
int
x,
y;
x
=
10;
y
=
25;
System.out.println(x);
// 10
System.out.println(y);
// 25
Також можна їх одразу ініціалізувати:
int
x
=
8,
y
=
15;
System.out.println(x);
// 8
System.out.println(y);
// 15
Відмінною рисою змінних і те, що ми можемо у процесі роботи програми змінювати їх значення:
int
x
=
10;
System.out.println(x);
// 10
x
=
25;
System.out.println(x);
// 25
Ключове слово var
Починаючи з Java 10 до мови було додано ключове слово var , яке також дозволяє визначати змінну:
var
x
=
10;
System.out.println(x);
// 10
Слово var ставиться замість типу даних, а сам тип змінної виводиться із значення, яке їй присвоюється. Наприклад, зміною x присвоюється число 10, отже, змінна представлятиме тип int.
Але якщо змінна оголошується за допомогою var , то ми обов'язково маємо ініціалізувати її, тобто надати їй початкового значення, інакше ми отримаємо помилку, як, наприклад, у наступному випадку:
var
x;
//! Помилка, змінна не ініціалізована
x
=
10;
Значення в інших системах числення
Як правило, значення для цілих змінних задаються в десятковій системі числення, проте ми можемо застосовувати й інші системи числення. Наприклад:
int
num111
=
0x6F;
// шістнадцяткова система, число 111
int
num8
=
010;
// вісімкова система, число 8
int
num13
=
0b1101;
// Двійкова система, число 13
Для завдання шістнадцяткового значення після символів 0x вказується число у шістнадцятковому форматі. Так само вісімкове значення вказується після символу 0 , а двійкове значення — після символів 0b .
Символи та рядки
В якості значення змінна символьного типу отримує одиночний символ, укладений у ординарні лапки: char ch = 'e'; ціле значення буде вказувати на номер символу в таблиці символів Unicode .
char
ch
=
102;
// символ 'f'
System.out.println(ch);
Ще однією формою завдання символьних змінних є шістнадцяткова форма: змінна набуває значення в шістнадцятковій формі, яке слідує після символів "\u" . Наприклад, char ch = '\u0066';
Символьні змінні не варто плутати з рядковими, 'a' не ідентично "a" .
String
hello
=
"Hellow.";
System.out.println(hello);
Константи
Крім змінних, в Java для зберігання даних можна використовувати константи.
final
int
LIMIT
=
5;
System.out.println(LIMIT);
// 5
// LIMIT = 57; // ми вже не можемо написати, оскільки LIMIT - константа
Як правило, константи мають імена в ВЕРХНЕМ_РЕЄСТРІ.
Константи дозволяють задати такі змінні, які не повинні змінюватися.
Основні типи даних: поняття та класифікація
Дані – це основа будь-якої комп'ютерної програми.Щоб ефективно працювати з даними у програмуванні, важливо розуміти їх типи та класифікацію. У цій статті ми докладно розглянемо базові поняття про типи даних, їх види та особливості. Це допоможе програмістам-початківцям краще орієнтуватися в світі даних.
Поняття типу даних
Тип даних - це характеристика значень, які може приймати змінна або вираз у програмі. Тип визначає діапазон допустимих значень, а також набір операцій, які можуть виконуватися над цими даними.
Наприклад, змінна типу int у мові С++ може зберігати лише цілі числа в діапазоні від -2147483648 до 2147483647. З нею можна виконувати арифметичні операції додавання, віднімання, множення і т.д. А змінна типу string призначена зберігання тексту, з нею можна виконувати операції конкатенації, пошуку підрядки тощо.
Типізація потрібна для того, щоб:
- Оптимізувати використання пам'яті - для кожного типу виділяється рівно стільки пам'яті, скільки потрібно
- Підвищити безпеку – не можна використовувати дані не за призначенням
- Спростити налагодження – типи допомагають виявити помилки
Розрізняють сильну та слабку типізацію мов програмування. У мовах зі слабкою типізацією (JavaScript, PHP) можна вільно наводити типи один до одного і використовувати дані нестрого за призначенням. У мовах із сильною типізацією (Java, C++) це утруднено чи заборонено, що підвищує надійність коду.
Класифікація типів даних. Існує безліч способів класифікувати типи даних у програмуванні. Розглянемо основні їх.
За рівнем структурованості
За цією ознакою виділяють:
- Прості (примітивні) типи даних - немає внутрішньої структури.До них відносяться числа, рядки, логічні значення.
- Складові (складні) типи даних – мають внутрішню структуру. Наприклад, масиви, структури, об'єкти.
За способом представлення у пам'яті
За цією ознакою виділяють:
- Цілочисельні (int, long)
- Речові (float, double)
- Логічні (bool)
- Символьні (char)
Це найбільш фундаментальна класифікація, що відображає різницю у зберіганні та допустимих значеннях.
По області значень
- Типи з обмеженою областю значень (перерахування, діапазони)
- Типи з необмеженою областю значень (цілі числа, речові числа)
Перерахування та діапазони дозволяють обмежити безліч допустимих значень. Це підвищує надійність та читабельність коду.
Цілочисленні типи даних
Цілочисленні типи призначені для представлення цілих чисел у програмах.
- Знаком (зі знаком чи беззнакові)
- Розрядністю (8, 16, 32, 64 біт)
- Діапазоном значень
Розглянемо докладніше знакові та беззнакові цілі числа.
Знакові та беззнакові цілі числа
У знакових цілих чисел:
- Старший біт відбиває знак числа (0 - позитивне, 1 - негативне)
- Діапазон у 2 рази менше, ніж у беззнакових того ж розміру
Наприклад, беззнакове 8-бітове ціле може набувати значень від 0 до 255. А знакове 8-бітове - від -128 до 127.
Беззнакові цілі використовуються, коли значення за визначенням не можуть бути від'ємними.
Знакові цілі дозволяють представляти як позитивні, і негативні числа.
Діапазони значень цілісних типів
У мовах програмування визначено цілі численні типи з різною розрядністю та відповідними діапазонами значень:
| Тип |
Розмір |
Діапазон значень |
| int |
4 байти |
-2147483648..2147483647 |
| long |
8 байт |
-9223372036854775808..9223372036854775807 |
Вибір конкретного цілого типу залежить від передбачуваних діапазонів значень і необхідного обсягу пам'яті.
Речові типи даних
Речові (дрібні) типи даних призначені представлення дробових чисел у програмах. Вони відрізняються від цілих тим, що мають дробову частину і плаваючу точку.
Формат подання дійсних чисел
Речові числа зберігаються у пам'яті у форматі:
- M - мантіса (значні цифри числа)
- p - порядок (показник ступеня заснування системи числення)
Наприклад, число 0.0546 у форматі з плаваючою точкою матиме вигляд:
Тобто 0.0546 = 0.0546*10^(-2).
Точність та діапазон значень
Для представлення дійсних чисел використовуються стандартні типи float та double з різною точністю:
- float - 7 знаків після коми
- double - 15-16 знаків після коми
Чим більша розрядність типу, тим більший діапазон допустимих значень і точність уявлення дробових чисел.
Наприклад, тип double дозволяє представляти дуже малі та дуже великі числа аж до 10^308. Це важливо у наукових розрахунках та моделюванні.
Логічний тип даних
Логічний тип даних призначений для зберігання логічних (бульових) значень Істина та Брехня.
У мовах програмування для логічного типу визначено константи:
Незважаючи на те, що логічний тип може набувати лише двох значень, у пам'яті він займає 1 байт. Це з особливостями архітектури комп'ютерів, через яку мінімальної адресованою одиницею пам'яті є байт.
Логічний тип даних широко використовують у логічних висловлюваннях, умовних конструкціях, циклах тощо. Наприклад:
bool isCompleted = false; if (isCompleted == true)
Символьний тип даних
Символьний тип даних призначено для зберігання окремих символів.
У пам'яті символи можуть зберігатися:
- У вигляді кодів (наприклад, код A - 65)
- У вигляді бітових рядків у певному кодуванні (ASCII, UTF-8 та ін.)
Для представлення символів мовами програмування використовується тип char. Наприклад:
Для зберігання послідовності символів (рядків тексту) використовуються спеціальні рядкові типи даних - string, varchar та ін.
Перераховані типи даних
Перерахування у програмуванні дозволяють обмежити безліч можливих значень, які може приймати змінна. Це зручний спосіб подання пов'язаних констант.
Наприклад, замість того щоб зберігати день тижня як число від 1 до 7, можна ввести перелік:
Days today = Days.Monday;
- Підвищують читабельність коду
- Виключають помилки при призначенні неприпустимих значень
- Дозволяють документувати допустимі значення
Переліки часто використовуються для представлення станів об'єктів, кодів помилок, статусів тощо. значень обмеженої множини.
Посилальні типи даних
Типи посилань даних не зберігають безпосередньо значення змінних, а містять посилання на них.
До типів посилань відносяться:
При створенні змінної типу посилання, в пам'яті виділяється місце для реальних даних, а в змінну записується адреса цих даних.
Тут змінну arr записується не масив з 5 елементів, а адресу пам'яті, де цей масив розміщений.
При передачі посилальних даних функції і методи, передається не копія даних, які адресу.Тому зміни всередині функції будуть видні в коді, що викликає:
void Increment(int[] array) < for (int i = 0; i < array.Length; i++) < array[i]++; >> int[] data = <1, 2, 3>; Increment(data); // data буде змінено
Це дозволяє ефективно працювати з великими обсягами даних, не копіюючи їх.
Параметризовані типи даних
Параметризовані (узагальнені) типи даних дозволяють вказувати інші типи як параметри при оголошенні змінної. Наприклад:
List list1 = new List(); // Список цілих чисел List list2 = new List(); // Список об'єктів Product
Тут список List оголошено з параметром T, який вказує тип елементів, що зберігаються в ньому.
Це дозволяє використовувати той самий код списку для зберігання об'єктів різних типів. Такий підхід називається параметричним поліморфізмом.
Переваги параметризованих типів:
- Повторне використання коду
- Безпека типів
- Зручність при розробці узагальнених структур даних
Параметризовані типи широко використовують у багатьох сучасних мовах програмування під час створення колекцій, ітераторів та інших узагальнених структур даних.
Додаткові види цілих даних
Крім стандартних цілих типів int і long, в деяких мовах програмування визначені додаткові типи з нестандартним розміром:
- short - коротке ціле, зазвичай 2 байти
- byte - байт, 1 байт
- uint - беззнакове ціле
- ulong - довге беззнакове ціле
Ці типи даних дозволяють вибрати оптимальний за розміром тип для конкретного завдання. Наприклад, для зберігання символів зручно використовувати байти.
Спеціальні види числових даних
Для представлення дуже великих чисел у деяких мовах використовуються цілі типи довільної довжини, наприклад:
Вони дозволяють працювати з цілими числами практично необмеженої довжини та масштабу. Це важливо у математичних обчисленнях.
Для представлення раціональних чисел використовуються спеціальні типи на кшталт Rational, які інкапсулюють чисельник та знаменник.
Структури та класи
Структури і класи в об'єктно-орієнтованих мовах програмування являють собою типи даних користувача, що визначаються програмістом.
Вони дозволяють зручно групувати дані та код для представлення реальних об'єктів та сутностей предметної області.
Наприклад, для представлення книги у програмі можна визначити клас Book:
На відміну від примітивних типів, класи дозволяють інкапсулювати як дані, і поведінка об'єкта.
Назвіть основні типи даних
Основні типи даних у програмуванні:
- Цілочисельні (int, long і т.д.)
- Речові (float, double)
- Символьні (char)
- Логічні (bool)
- Рядкові (string)
- Перерахування (enum)
- Посилальні (масиви, структури, класи)
Ці основні типи даних є практично у всіх мовах програмування. Знання їх особливостей необхідне будь-якому програмісту.
Перерахуйте основні типи даних
Давайте перерахуємо основні типи даних:
- Цілі числа (int, long)
- Числа з плаваючою точкою (float, double)
- Символи (char)
- Логічні значення (bool)
- Текстові рядки (string)
- Перерахування (enum)
- Посилальні типи (масиви, класи)
Ці типи використовують у переважній більшості завдань програмування. Володіння ними – основа професії програміста.
Вибір типів даних
При написанні програм важливо правильно вибирати типи даних. Основні критерії вибору:
- Діапазон та точність значень
- Необхідний обсяг пам'яті
- Зручність використання
- Продуктивність
Наприклад, для зберігання символів зручніше використовувати char, а не int. А в чисельних розрахунках краще double, ніж float.
Грамотний вибір типів даних дозволяє оптимізувати програму та уникнути помилок.