Вітання! Раніше, під час навчання, ми працювали з одиничними об'єктами (або примітивними типами). Але якщо нам потрібно працювати не з одним об'єктом, а з цілою групою? Наприклад, ми хочемо створити список днів народження всіх працівників нашої компанії. Він має містити, скажімо, 30 рядків у форматі: "Андрій Петроов, 25 січня". Тут нам допоможе спеціальна структура даних – масив. Якщо порівняти масив з предметами з реального життя, його пристрій дуже схоже на банківське сховище з осередками: Масив теж складається з осередків. У кожен осередок ти можеш щось покласти. При цьому для доступу до вмісту потрібно знати номер комірки. Створюється масив ось так:
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10]; //масив рядків Java
}
}
Тут ми створабо масив на 10 осередків. Ти одразу можеш звернути увагу на деякі особливості масиву:
- Він зберігає дані строго певного типу. Якщо ми спочатку створабо масив рядків
String
, ми не зможемо зберігати в ньому щось інше. Тип даних вказується під час створення масиву. У цьому його відмінність від банківського осередку, у якому клієнт може зберігати що захоче. - Масив може зберігати дані примітивних типів (наприклад,
int
), рядки (String
) чи об'єкти одного класу. Точніше навіть самі об'єкти, а посилання ці об'єкти. - Розмір масиву обов'язково вказується під час створення. Вказати його пізніше або змінити розмір після створення не вдасться.
[]
в обох виразах. Їх можна вказати до назви змінної-посилання або після — працюватиме і так, і так:
//Java-масиви рядків, два варіанти синтаксису
String [] birthdays = new String[10];
String birthdays [] = new String[10];
Якщо ти хочеш щось записати в масив, тобі потрібно вказати номер осередку, в якому буде записано значення. Номери осередків масиву починається з 0. Починати відлік з нуля — найпоширеніша практика в програмуванні. Чим швидше ти до цього звикнеш, тим краще:) Тобто якщо ти хочеш покласти якесь значення в перший осередок масиву , це робиться так:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Олена Єлісєєва, 12 березня";
}
}
Тепер у першому осередку нашого масиву, який містить дні народження колег, зберігається рядок із днем народження Олени. За аналогією можна додати інші значення:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Олена Єлісєєва, 12 березня";
birthdays[1] = "Коля Романов, 18 травня";
birthdays[7] = "Олеся Остапенко, 3 січня";
}
}
Зверни увагу: день народження Олесі ми додали до восьмого осередку (не забув ще, чому осередок №7 — восьмий?). Хоча всі інші осередки у нас не заповнені. Не обов'язково записувати значення масиву по порядку — такого обмеження немає. З іншого боку, якщо записуватимеш по порядку, набагато простіше стежитиме за кількістю вільних і зайнятих осередків, і в масиві не залишатиметься "дір". Якщо ти хочеш отримати вміст осередку масиву, як і у випадку з банківським, тобі потрібно знати її номер. Робиться це так:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Олена Єлісєєва, 12 березня";
birthdays[1] = "Коля Романов, 18 травня";
birthdays[7] = "Олеся Остапенко, 3 січня";
String olesyaBirthday = birthdays[7];
System.out.println(olesyaBirthday);
}
}
Виведення в консоль:
Олеся Остапенко, 3 января
Ми створабо змінну String
і сказали компілятору: "Знайди комірку з індексом 7 в масиві birthdays
і присвоє значення, яке там зберігається, в змінну String
olesyaBirthday
". Саме це він і зробив.
Довжина масиву Java
Працюючи з масивом ти можеш легко дізнатися його довжину з допомогою спеціального властивості —length
.
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Олена Єлісєєва, 12 березня";
birthdays[1] = "Коля Романов, 18 травня";
birthdays[7] = "Олеся Остапенко, 3 січня";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
Виведення в консоль:
10
Зауваж:як length
зберігається розмір масиву, а чи не кількість заповнених осередків. Наш масив зберігає лише 3 значення, але при створенні ми вказали йому розмір = 10. Саме це значення повертає поле length
. Навіщо це може стати в нагоді? Ну, наприклад, якщо ти захочеш вивести в консоль список усіх днів народження (щоб перевірити, що нікого не забули), це можна зробити в одному простому циклі:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Олена Єлісєєва, 12 березня";
birthdays[1] = "Коля Романов, 18 травня";
birthdays[2] = "Віка Ігнатова, 12 липня";
birthdays[3] = "Деніс Козлов, 7 вересня";
birthdays[4] = "Максим Масленников, 9 листопада";
birthdays[5] = "Роман Баранов, 14 серпня";
birthdays[6] = "Валерія П'яткіна, 1 квітня";
birthdays[7] = "Олеся Остапенко, 3 січня";
birthdays[8] = "Костя Гурко, 19 жовтня";
birthdays[9] = "Сергій Наумов, 3 травня";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
У циклі ми створюємо змінну i
, яка спочатку дорівнює нулю. При кожному проході ми беремо комірку з індексом i з нашого масиву та виводимо її значення на консоль. Цикл зробить 10 ітерацій, і значення i збільшуватимуться від 0 до 9 — саме за індексами осередків нашого масиву! Таким чином ми виведемо в консоль всі значення від birthdays[0]
до birthdays[9]
Насправді є способи створити масив по-іншому. Наприклад, масив чисел int
можна створити так:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
Цей спосіб називається "швидкою ініціалізацією". Він досить зручний тим, що ми одразу створюємо масив і заповнюємо його значеннями. Не потрібно явно вказувати розмір масиву — поле length
при швидкій ініціалізації заповниться автоматично.
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
Виведення в консоль:
9
Масив об'єктів Java
Ти вже чув, що масиви об'єктів та масиви примітивів по-різному зберігаються у пам'яті. Візьмемо, наприклад, масив із трьох об'єктівCat
:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Томас");
cats[1] = new Cat("Бегемот");
cats[2] = new Cat("Філіп Маркович");
}
}
Тут треба розуміти кілька речей:
- Що стосується примітивами масиви Java зберігають безліч конкретних значень (наприклад, чисел
int
). Що стосується об'єктами масив зберігає безліч посилань. Масивcats
складається з трьох осередків, у кожному з яких є посилання на об'єктCat
. Кожне з посилань вказує на адресау пам'яті, де цей об'єкт зберігається. - Елементи масиву у пам'яті розміщуються в єдиному блоці. Це зроблено для більш ефективного та швидкого доступу до них. Таким чином, посилання
cats
вказує на блок пам'яті, де зберігаються всі об'єкти - елементи масиву. Аcats[0]
на конкретну адресау всередині цього блоку.
Масив масивів або двовимірний масив
Виходячи з цього перед нами постає питання — а чи можемо ми створити, наприклад, не масив рядків чи чисел, а масив масивів? І відповідь буде – так, можемо! Масив може зберігати в собі будь-які об'єкти, включаючи інші масиви. Такий масив називатиметься двовимірним. Якщо зобразити його на зображенні, він буде дуже схожий на звичайну таблицю. Наприклад, ми хочемо створити масив, який зберігатиме 3 масиви чиселint
по 10 осередків у кожному. Виглядатиме це так: Кожен рядок зображує масив чисел int
. Перший масив містить числа від 1 до 10, другий - від -1 до -10, третій - набір випадкових чисел. Кожен із цих масивів зберігається в осередку нашого двовимірного масиву. Ініціалізація двовимірного масиву в коді виглядає так:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
Наш двомірний масив cats зберігає 3 масиви по 5 осередків у кожному. Якщо ми хочемо покласти наш об'єкт у третій осередок другого масиву, це робиться так:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Пушок");
}
[1]
вказує на другий масив, а [2]
- на третій осередок цього масиву. Оскільки двовимірний масив складається з декількох масивів, щоб його обійти і вивести в консоль всі значення (або заповнити всі комірки), нам знадобиться вже подвійний, вкладений цикл:
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
У зовнішньому циклі (змінна i
) ми по черзі обходимо всі масиви, з яких складається наш двомірний масив. У внутрішньому циклі (змінна j
) ми перебираємо всі осередки кожного масиву. У результаті першим буде виведено на консоль об'єкт cats[0][0]
(перший масив, перший осередок), другим - cats[0][1]
(перший масив, другий осередок). Коли перший масив буде вичерпаний - виводитимуться cats[1][0]
, і так далі. До речі, для двовимірних масивів також доступна швидка ініціалізація: cats[1][1]
cats[1][2]
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
У звичайному вигляді ми записали б двовимірний масив numbers
як int[3][3]
, а такий спосіб дає нам можливість відразу вказати значення. Навіщо двовимірний масив може знадобитися? Ну, наприклад, за його допомогою ти легко можеш відтворити знамениту гру "Морський бій": Структура ігрового поля в "Морському бою" така, що її можна легко описати: двомірний масив із 10 масивів, по 10 осередків у кожному. Ти створюєш два такі масиви — для себе та свого супротивника:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
Ви заповнюєте якимись значеннями (наприклад, цифрами або знаками *
) ті осередки, в яких розташовуються твої кораблі, а потім ви з супротивником по черзі називаєте номери осередків:
- seaBattle[6][5]!
- Мимо! seaBattle2[6][6]!
- Поранений!
- seaBattle2[6][7]!
- Поранений!
- seaBattle2[6][8]!,
- Вбито!
Додаткові матеріали про масиви
Хочете знати більше про масиви? Зверніть увагу на статті нижче. Там багато цікавого та корисного з цієї теми.- Масиви в Java — докладна стаття про масиви, їх створення, ініціалізацію та використання. Із прикладами.
- Клас Arrays та його використання - у статті описані деякі методи класу
Array
- Масиви – перша лекція JavaRush, присвячена масивам.
- Багатомірні масиви - докладна стаття про багатовимірні масиви з прикладами.
- Повертайте масив нульової довжини, а не null – автор "Ефективного програмування" Джошуа Блох розповідає про те, як краще повертати порожні масиви.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ