JavaRush/Курси/Java Syntax Zero/Особливості роботи з масивами

Особливості роботи з масивами

Відкрита

1. Масиви в пам'яті

Малюнки в попередніх прикладах трохи неточні.

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

Зеленим кольором показано масив на 10 елементів типу int і змінну типу int[], яка зберігає адресу (посилання) масиву типу int у пам'яті.

Для порівняння синім кольором позначено звичайну змінну типу int, яка зберігає значення 199.

Чимось нагадує зберігання рядків у пам'яті, чи не так?

Дійсно, рядки. І так само, як під час операцій з рядками, «змінні типу масив» можна присвоювати одна одній:

Код Пояснення
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
Створюємо масив на 10 елементів типу int.
У комірку з індексом 2 записуємо значення 4.
У комірку з індексом 7 записуємо значення 9.
У змінній b зберігаємо адресу, записану в змінній a.
Тепер a і b вказують на один і той самий об'єкт-масив у пам'яті.
У комірку з індексом 9 об'єкта-масиву записуємо суму значень, які зберігаються в комірках 2 (зберігається 4) і 7 (зберігається 9).

При цьому об'єкт-масив залишатиметься на своєму місці, а змінні a і b зберігатимуть однакові адреси (посилання) на один і той самий об'єкт. Погляньте на малюнок:


2. Детальніше про роботу з масивом

Масив можна створити з елементів будь-якого типу. Для цього потрібно лише до назви типу додати квадратні дужки. Загальний вигляд створення масиву такий:

тип[] ім'я = 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[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
Важливо!
До речі, звертаємо вашу увагу, що якщо спробувати звернутися до комірки масиву за індексом, якого в масиві немає (у нашому випадку це всі цілі числа, крім чисел 0..99), програма аварійно завершиться з помилкою ArrayIndexOutOfBoundsException — індекс поза межами масиву.

3. Довжина масиву

Як ви побачили в попередньому прикладі, можна окремо створити змінну типу масив і потім десь у коді присвоїти їй значення (посилання на об'єкт-масив). Можна зробити навіть так:

Код Пояснення
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
Створюємо змінну-масив типу int[]
Якщо змінна a менша за 10,
то створити масив із 10 елементів.
Інакше
створити масив із 20 елементів

І як надалі працювати з таким масивом? Як дізнатися, скільки в ньому елементів?

Для цього масив має спеціальну властивість (змінну) — length. І визначити довжину масиву можна за допомогою такого виразу:

array.length;

де array — це ім'я змінної-масиву, а length — це ім'я властивості об'єкта-масиву. Значення у властивості length змінити не можна: саму властивість length можна присвоювати іншим змінним, але їй жодного значення присвоїти не можна (програма просто не скомпілюється).

Отак можна продовжити попередній приклад:

Код Пояснення
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
Створюємо змінну-масив типу int[]
Якщо змінна a менша за 10,
то створити масив із 10 елементів.
Інакше
створити масив із 20 елементів
Цикл по всіх елементах масиву: від 0 до довжини array.length – 1

4. Резюмуємо факти про масиви в Java

Резюмуймо відомі факти про масиви:

Факт 1. Масив складається з багатьох комірок.

Факт 2. Доступ до конкретної комірки здійснюється за її номером.

Факт 3. Усі комірки — одного типу.

Факт 4. Початкове значення для всіх комірок — 0 і null (якщо в комірці зберігається адреса), false (для типу boolean). Докладніше про значення за замовчуванням ви дізнаєтеся з цієї лекції.

Факт 5. String[] list — це просто оголошення змінної: сам контейнер (об'єкт-масив) ще не створено. Щоб із ним можна було працювати, потрібно створити масив (контейнер) і записати його в цю змінну, а потім вже ним користуватися. Див. приклади нижче.

Факт 6. Коли ми створюємо об'єкт-масив (контейнер), маємо вказати, якої він довжини, тобто скільки в ньому комірок. Для цього використовуємо таку команду: new TypeName[n];

Факт 7. Довжину масиву можна визначити за допомогою властивості .length.

Факт 8. Після створення масиву не можна змінити ані тип його елементів, ані їх кількість.

Код Пояснення
String s;
String[] list;
s дорівнює null
list дорівнює null
list = new String[10];
int n = list.length;
Змінна list зберігає посилання на об'єкт — масив рядків із 10 елементів.
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 значень.

6
Задача
Java Syntax Zero,  6 рівень2 лекція
Недоступна
Об'єднуємо масиви
Реалізувати метод main(String[]), який має скопіювати вміст масивів firstArray і secondArray в один масив resultArray. Масив firstArray має бути розташований на початку нового масиву resultArray, а secondArray — після першого.
Коментарі (55)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Anonymous #3619820
Рівень 6
19 вересня 2025, 17:30
Чому з System.out.println("") усе виводится правильно а перевірка каже що там щось не так.
package ua.javarush.task.pro.task05.task0504;

/*
Об'єднуємо масиви
*/

public class Solution {
    public static int[] firstArray = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    public static int[] secondArray = new int[]{10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
    public static int[] resultArray;

    public static void main(String[] args) {
        //напишіть тут ваш код
        resultArray = new int[20];
        for (int i = 0; i < resultArray.length; i++) {
            if(i < 10) {
                resultArray[i] = firstArray[i];
            }
            else {
                resultArray[i] = secondArray[i - 10];
            }

            System.out.println(resultArray[i]);
        }
    }
}
Konstantin
Рівень 6
6 травня 2025, 22:57
public class Solution { public static int[] firstArray = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; public static int[] secondArray = new int[]{10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; public static int[] resultArray; public static void main(String[] args) { resultArray = new int [firstArray.length + secondArray.length]; System.arraycopy(firstArray, 0, resultArray, 0, firstArray.length); System.arraycopy(secondArray, 0, resultArray, firstArray.length, secondArray.length); for (int i = 0; i < resultArray.length; i++) { System.out.print(resultArray[i] + ", "); } } }
Андрій Андрушків FullStack Developer в IT Specialist
2 березня 2025, 15:16
був чуть обурений після задачі про копіювання масивів(( валідатор зараховує завдання тільки якщо написати 2 окремі цикли.. я зробив одним і майже годину не міг зрозуміти, в чому проблема. виправте це, за можливості, дякую!
hidden #3500645
Рівень 30
28 жовтня 2024, 18:50
Підкажіть, будь ласка, останній приклад в лекції: Що це за одиничка і що вона означає? Цикл по всіх елементах масиву: від 0 до довжини array.length – 1
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
IronMan57
Рівень 1
19 листопада 2024, 23:40
Оскільки індекси елементів масиву завжди починаються з нуля, то індекс останнього елемента в масиві буде завжди на одиницю менший, чим кількість елементів у ньому. Наприклад ініціалізуємо масив з трьох елементів: int length = 3; int[] array = new int[length]; Тоді у першого елемента індекс = 0, у другого = 1, у третього (і останнього у цьому масиві) = 2. Властивість массиву array.length у цьому випадку дорівнюватиме 3. Тому у циклі звернення до елементів масиву буде: array[0], array[1], array[2]. Також тому в умові продовження циклу for задано, що індекс повинен бути менший кількості елементів (довжини): i < array.length.
hidden #3500645
Рівень 30
20 листопада 2024, 09:57
дякую за відповідь, вже розібралася) це зрозуміло, що у масиві індекс буде в останнього елемента на 1 менший, ніж фактична довжина, тому що нумерація з нуля і якщо взяти елемент з індексом, що дорівнює фактичній кількості елементів масиву буде помилка ArrayIndexOutOfBoundsException, бо його не існуватиме, останній елемент< array.length на одиничку там просто в лекції замість мінусу тире стоїть і тому не могла зрозуміти, до чого там одиничка створила запит в розділі підтримки і підказали, що просто невірно прочитала "Цикл по всіх елементах масиву: від 0 до довжини array.length – "не тире 1, а мінус 1" забула просто, що тут теж коментар залишала)
Alex
Рівень 2
7 серпня 2024, 02:31
resultArray = new int[firstArray.length + secondArray.length];

        for (int i = 0; i < firstArray.length; i++) {
            resultArray[i] = firstArray[i];
        }

        for (int i = 0, j = resultArray.length / 2; i < secondArray.length; i++, j++) {
            resultArray[j] = secondArray[i];
        }
працює правильно, але не проходить останній тест(
Dmytrii
Рівень 32
5 червня 2024, 12:49
почеум не принимает такое решение?
resultArray = new int[firstArray.length + secondArray.length];
for (int i = 0; i < firstArray.length; i++) {
    resultArray[i] = firstArray[i];
}
for (int i = 10; i < resultArray.length; i++) {
    resultArray[i] = secondArray[i - 10];
}
Dmytrii
Рівень 32
5 червня 2024, 17:19
понял почему. надо использовать не 10, а длину первого массива, тогда принимает
Ivan Kravets старший механік в ImperyMotors
10 грудня 2023, 18:34
ініціалізацію ressArray потрібно робити в методі main
Volodymyr Victorovich
Рівень 12
26 серпня 2025, 08:06
дякую!
17 вересня 2023, 17:37
Довго мучився, спочатку написав код, що був поза межами лекцій, та допомогою оцієї елегантної конструкції:
resultArray = IntStream.concat(IntStream.of(firstArray), IntStream.of(secondArray)).
Але валідацію не пройшов останнім пунктом. Пішов гортати "допомогу спільноти". Зрозумів, що в людей +/- такі самі питання, вирішив спробувати ще якісь варіанти. Дякуючи коментарю шановного Roma Chernesh, зрозумів, куди саме рити. Але, людоньки, будьте дуже уважні, бо можна ненароком зайвий "if" вставити, а потім дивитись квадратними очима на червону консольку. Взагалом так. Задача, по суті, вирішується з допомогою цикла "if-else" і, ні в якому разі не указуйте жодної цифри, окрім "0", яким задається початковий параметр для змінної
Kolapsec Далекобійник - Маркетолог
27 листопада 2023, 16:20
2 цикла for, 8 рядків коду
Гаркін
Рівень 14
14 лютого 2024, 19:53
написати треба 1 цикл for. Другий - це вже вивід на друк. Як? Ось моє рішення:
Ivan Maksymovych
Рівень 1
Expert
9 серпня 2023, 14:38
Нашел такой интересный класс как IntStream, он как раз то что тут нужно)) Самое простое и легкое решение получается)
resultArray = IntStream.concat(IntStream.of(firstArray), IntStream.of(secondArray)).toArray();
По сути мы берем в поток наши значения с первого массива, и со второго благодаря IntStream.of(); делаем конкатенацию благодаря IntSteam.concat(), и все это засовываем в массим благодаря .toArray(), как по мне то очень удобно))
Олексій Моцьор
Рівень 27
Expert
15 липня 2023, 09:41
Копіювання зробив через System.arraycopy() результат вийшов правильний але валідатор не пропускає. Хоче щоб копіювали через цикли....Цікаво хто буде городити таку програму, якщо є простий метод копіювання масивів?
23 липня 2023, 21:16
Звучить логічно, але ж суть уроку опанувати цикли і роботу з масивами, щоб застовувати цей досвід в майбутньому
Vitalii Backend Developer
29 липня 2023, 06:10
в умовах нічого не написано про цикли. тому і логіки ніякої тут нема