1. Масив — це контейнер елементів
Ймовірно, ви чули, що компʼютери можуть обробляти величезні обсяги інформації. Умовний оператор (if-else) і цикли (for, while), звісно, у цьому допомагають. Проте цього недостатньо, адже дані потрібно десь зберігати.
Для цього в Java, як і майже в усіх мовах програмування, є зручний інструмент — масиви (Array). Їх ще називають таблицями.
Масив — це спеціальний обʼєкт, у якому можна зберігати не одне значення, а кілька.

Якщо раніше ми порівнювали змінну з коробкою (де можна зберігати якесь значення), то масив — це радше велика коробка, розділена всередині на секції. Кожна секція має свій номер. Нумерація починається з нуля.
Або проведімо іншу аналогію. Порівняймо звичайний житловий будинок і багатоповерхівку. Звичайний будинок займає одна сімʼя, а багатоповерхівка поділена на квартири. Щоб написати листа сімʼї, яка живе у звичайному будинку, треба вказати його унікальну адресу. А щоб написати листа сімʼї, яка живе в квартирі, потрібно вказати унікальну адресу будинку та ще й номер квартири.
Отже, змінна‑масив — це змінна‑багатоповерхівка. У ній можна зберігати не одне значення, а кілька. У такій змінній є кілька квартир (комірок), до кожної з яких можна звернутися за її номером (індексом).
Для цього після імені змінної в квадратних дужках потрібно вказати індекс комірки, до якої звертаємося. Це доволі просто:
array[індекс] = значення;
Де array — це імʼя змінної‑масиву, індекс — номер комірки в масиві, а значення — значення, яке ми хочемо занести в зазначену комірку.
Спочатку розберімося, як створювати масиви.
2. Створення масиву елементів у Java

Припустімо, вашій програмі потрібно десь зберігати 100 цілих чисел. Найімовірніше, для цього підійде масив. Як його створити?
Якби потрібно було зберігати одне ціле число, підійшов би тип int. А якщо потрібно зберігати 100 цілих чисел, знадобиться масив типу int. Ось як виглядатиме код його створення:
int[] array = new int[100];
Розберімося, що тут написано.
Ліворуч від знака рівності — оголошення змінної з імʼям array і типу int[]. Після типу int ідуть квадратні дужки, які вказують, що в «коробках» цього типу можна зберігати не одне значення, а кілька.
Праворуч від знака рівності — створення обʼєкта (ключове слово new) на 100 елементів (комірок) типу int.
Якщо, наприклад, потрібно створити масив із 20 комірок для зберігання дійсних чисел, код його створення виглядатиме так:
double[] vals = new double[20];
Кількість комірок у масиві називають розміром масиву або довжиною масиву. Завдяки здатності зберігати багато значень масиви ще називають контейнерами.
Важливий факт: розмір масиву не можна змінити після створення.
Можна створити новий масив, але довжину вже створеного масиву змінити не вдасться.
3. Робота з комірками масиву

Створювати масиви ми навчилися. А як правильно з ними працювати?
Майже так само, як і зі звичайними змінними: лише після імені змінної‑масиву потрібно вказувати номер комірки, з якою працюємо.
Нумерація комірок масиву завжди починається з нуля. Якщо маємо масив на 10 елементів, то номери (індекси) його комірок — 0..9; якщо масив на 200 елементів — 0..199. І далі за аналогією.
Приклади:
int[] a = new int[10]; // Створюємо масив на 10 елементів типу int.
a[2] = 4; // У комірку з індексом 2 записуємо значення 4.
a[7] = 9; // У комірку з індексом 7 записуємо значення 9.
a[9] = a[2] + a[5]; // У комірку з індексом 9 записуємо суму значень із комірок 2
// (зберігається 4) і 5 (зберігається 0).
Ось що зберігатиметься в памʼяті після виконання цього коду:
Стовпчик ліворуч від масиву (сірим кольором) — це номери (індекси) комірок. У комірках зберігаються внесені значення: 4, 9 і 4. Одразу після створення масиву його комірки заповнюються нулями (для числових типів).
Важливо. Усі комірки масиву мають однаковий тип даних. Якщо створено масив рядків String, у його комірках можна зберігати тільки рядки. Тип даних масиву задається під час його створення. Ані тип даних, ані довжину масиву надалі змінити не можна.
4. Масиви в памʼяті
Ілюстрації в попередніх прикладах трохи спрощені.
Під час створення масивів (як і під час створення рядків) в оперативній памʼяті виділяються два блоки: один для зберігання самого масиву (контейнера), а другий — для змінної, яка зберігає його адресу (посилання). Уточнену ситуацію зображено на рисунку нижче:

Зеленим кольором зображено масив на 10 елементів типу int і змінну типу int[], яка зберігає адресу (посилання) масиву типу int у памʼяті.
Для порівняння синім кольором позначено звичайну змінну типу int, яка зберігає значення 199.
Дещо нагадує зберігання рядків у памʼяті, чи не так?
Саме так. Так само, як і з рядками, змінні типу «масив» можна присвоювати одна одній:
int[] a = new int[10]; // Створюємо масив на 10 елементів типу int.
a[2] = 4; // У комірку з індексом 2 записуємо значення 4.
a[7] = 9; // У комірку з індексом 7 записуємо значення 9.
int[] b = a; // У змінну b зберігаємо адресу, яка є в змінній a.
// Тепер a і b вказують на один і тотожний обʼєкт‑масив у памʼяті.
a[9] = b[2] + a[7]; // У комірку з індексом 9 обʼєкта‑масиву записуємо суму значень
// із комірок 2 (зберігається 4) і 7 (зберігається 9).
При цьому обʼєкт‑масив залишиться на своєму місці, а змінні a і b зберігатимуть однакові адреси (посилання) на один і той самий обʼєкт. Дивіться ілюстрацію:

5. Робота з масивом детальніше
Масив можна створити практично з будь‑якого типу. Для цього лише потрібно після імені типу написати квадратні дужки. Загальний вигляд створення масиву такий:
тип[] імʼя = new тип[кількість];
Де тип — це тип елементів (комірок), що зберігатимуться в масиві. Імʼя — це імʼя змінної, за яким ми звертатимемося до масиву, а кількість — кількість комірок у масиві.
У прикладі вище наведено канонічну форму: створення змінної‑масиву та створення обʼєкта‑масиву. Насправді це дві незалежні конструкції. Можна створити змінну‑масив і обʼєкт‑масив окремо:
тип[] імʼя;
імʼя = new тип[кількість];
Ще один важливий момент
Індекс масиву або кількість елементів масиву можуть бути змінними й навіть цілими виразами.
Приклади:
int n = 100;
int[] a = new int[n]; // Створення масиву на n елементів
int n = 100;
int[] a = new int[n * 2 + 3]; // Створення масиву на 203 елементи
int n = 100;
int[] a = new int[n];
a[n-1] = 2; // a[99] = 2;
a[n-2] = 3; // a[98] = 3;
a[n/5] = a[n-1] + a[n-2]; // a[20] = a[99] + a[98];
Вихід за межі масиву
Зверніть увагу: якщо спробувати звернутися до комірки масиву за індексом, якого в масиві немає (у нашому випадку це всі цілі числа, окрім чисел 0..99), програма аварійно завершиться з помилкою ArrayIndexOutOfBoundsException — індекс за межами масиву.
6. Довжина масиву
Як показано вище, можна окремо оголосити змінну типу «масив» і потім десь у коді присвоїти їй значення (посилання на обʼєкт‑масив). Можна зробити навіть так:
int[] array; // Створюємо змінну‑масив типу int[]
if (a < 10) // Якщо змінна a менша за 10,
array = new int[10]; // то створити масив із 10 елементів.
else // Інакше
array = new int[20]; // створити масив із 20 елементів
Як далі працювати з таким масивом? Як дізнатися, скільки в ньому елементів?
Для цього у масиву є спеціальна властивість — length. Дізнатися довжину масиву можна за допомогою такого виразу:
array.length;
Де array — це імʼя змінної‑масиву, а length — імʼя властивості обʼєкта‑масиву. Значення властивості length змінити не можна: її можна зчитувати та присвоювати іншій змінній, але присвоїти значення самій властивості — ні (код не скомпілюється).
Ось як можна продовжити попередній приклад:
int[] array; // Створюємо змінну‑масив типу int[]
if (a < 10) // Якщо змінна a менша за 10,
array = new int[10]; // то створити масив із 10 елементів.
else // Інакше
array = new int[20]; // створити масив із 20 елементів
for (int i = 0; i < array.length; i++) // Цикл по всіх елементах масиву: від 0 і до array.length − 1
{
System.out.println(array[i]);
}
7. Факти про масиви в Java
Підсумуємо відомі факти про масиви:
- Факт 1. Масив складається з багатьох комірок.
- Факт 2. Доступ до конкретної комірки здійснюється за її номером.
- Факт 3. Усі комірки мають однаковий тип.
- Факт 4. Початкове значення для всіх комірок — 0 для числових типів, null (якщо в комірці зберігається адреса) і false для типу boolean.
- Факт 5. String[] list — це лише оголошення змінної: сам контейнер (обʼєкт‑масив) ще не створений. Щоб із ним можна було працювати, треба створити масив (контейнер), покласти його в цю змінну й уже тоді ним користуватися. Див. приклад нижче.
- Факт 6. Коли створюємо обʼєкт‑масив (контейнер), потрібно вказати його довжину — скільки в ньому комірок. Це робиться командою виду: new TypeName[n];
- Факт 7. Довжину масиву можна дізнатися через властивість .length.
- Факт 8. Після створення масиву не можна змінити ні тип його елементів, ні їхню кількість.
String s; // s дорівнює null
String[] list; // list дорівнює null
list = new String[10]; // Змінна list зберігає посилання на обʼєкт — масив рядків із 10 елементів.
int n = list.length; // n дорівнює 10
list = new String[0]; // Тепер list містить масив із 0 елементів.
// Масив є, але зберігати елементи він не може.
list = null;
System.out.println(list[1]); // Буде згенерована помилка — програма аварійно завершиться.
// list містить порожнє посилання — null
list = new String[10];
System.out.println(list[10]); // Буде згенерована помилка — вихід за межі масиву.
// Якщо list містить 10 елементів/комірок, то припустимі індекси: 0 1 2 3 4 5 6 7 8 9 — усього 10 елементів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ