JavaRush /Курси /JAVA 25 SELF /Знайомство з масивами

Знайомство з масивами

JAVA 25 SELF
Рівень 7 , Лекція 1
Відкрита

1. Масив — це контейнер елементів

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

Для цього в Java, як і майже в усіх мовах програмування, є зручний інструмент — масиви (Array). Їх ще називають таблицями.

Масив — це спеціальний обʼєкт, у якому можна зберігати не одне значення, а кілька.

Масиви (Array) Java

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

Або проведімо іншу аналогію. Порівняймо звичайний житловий будинок і багатоповерхівку. Звичайний будинок займає одна сімʼя, а багатоповерхівка поділена на квартири. Щоб написати листа сімʼї, яка живе у звичайному будинку, треба вказати його унікальну адресу. А щоб написати листа сімʼї, яка живе в квартирі, потрібно вказати унікальну адресу будинку та ще й номер квартири.

Отже, змінна‑масив — це змінна‑багатоповерхівка. У ній можна зберігати не одне значення, а кілька. У такій змінній є кілька квартир (комірок), до кожної з яких можна звернутися за її номером (індексом).

Для цього після імені змінної в квадратних дужках потрібно вказати індекс комірки, до якої звертаємося. Це доволі просто:


array[індекс] = значення;
Присвоєння значення комірці масиву за індексом

Де array — це імʼя змінної‑масиву, індекс — номер комірки в масиві, а значення — значення, яке ми хочемо занести в зазначену комірку.

Спочатку розберімося, як створювати масиви.

2. Створення масиву елементів у Java

Створення масиву елементів у Java

Припустімо, вашій програмі потрібно десь зберігати 100 цілих чисел. Найімовірніше, для цього підійде масив. Як його створити?

Якби потрібно було зберігати одне ціле число, підійшов би тип int. А якщо потрібно зберігати 100 цілих чисел, знадобиться масив типу int. Ось як виглядатиме код його створення:

int[] array = new int[100];
Створення масиву на 100 чисел int

Розберімося, що тут написано.

Ліворуч від знака рівності — оголошення змінної з імʼям array і типу int[]. Після типу int ідуть квадратні дужки, які вказують, що в «коробках» цього типу можна зберігати не одне значення, а кілька.

Праворуч від знака рівності — створення обʼєкта (ключове слово new) на 100 елементів (комірок) типу int.

Якщо, наприклад, потрібно створити масив із 20 комірок для зберігання дійсних чисел, код його створення виглядатиме так:

double[] vals = new double[20];
Створення масиву з 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).

Ось що зберігатиметься в памʼяті після виконання цього коду:

Робота з комірками масиву типу int

Стовпчик ліворуч від масиву (сірим кольором) — це номери (індекси) комірок. У комірках зберігаються внесені значення: 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 зберігатимуть однакові адреси (посилання) на один і той самий обʼєкт. Дивіться ілюстрацію:

Масиви в памʼяті 2

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;
Отримання довжини масиву через властивість 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 елементів. 	
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ