JavaRush /Курсы /Java Syntax Pro /Нюансы работы с массивами

Нюансы работы с массивами

Java Syntax Pro
5 уровень , 1 лекция
Открыта

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

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 штук.


Комментарии (638)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Nemo Уровень 1
12 января 2026

int length1 = firstArray.length;
int length2 = secondArray.length;
resultArray = Arrays.copyOf(firstArray, length1 + length2);
System.arraycopy(secondArray, 0, resultArray, length1, length2);
System.out.println(resultArray);
подскажите пожалуйста, как исправить так, чтобы вывод получался читаемым нам (сейчас вывод в консоль такой: [I@1b9e1916 ) и при этом код был принят тренажером? ps заменил строчку System.out.println(resultArray); на эту:

System.out.println(Arrays.toString(array));
Анна Клушкина Уровень 12
4 января 2026
⛏ продолжение банкета
Роман Зарубин Уровень 8
28 ноября 2025
Работаем !
C0N5P1RACY Уровень 23
27 ноября 2025
Теперь мы тратим по 8 материи :((
Egalpra Уровень 9
13 ноября 2025
А вот интересно. Что, с точки зрения производительности правильнее. Каждый раз юзать .length, или сначала вычислить в отдельные переменные длины массивов, а потом просто подставлять их в коде?
Александр Уровень 8
2 ноября 2025
int one = firstArray.length; int two = secondArray.length; int three = one + two; resultArray = new int[three]; for(int i = 0; i < three;i++) { if (i < 10) { resultArray[i] = firstArray[i]; System.out.println(resultArray[i]); } else { resultArray[i] = secondArray[i-one]; System.out.println(resultArray[i]); } }
Entropie Уровень 8
23 сентября 2025

        resultArray = new int[firstArray.length + secondArray.length];
        for (int i = 0; i < resultArray.length; i++) {
            if (i < firstArray.length) resultArray[i] = firstArray[i];
            else resultArray[i] = secondArray[i - firstArray.length];
        }
Dmitry Terekhov Уровень 24
17 августа 2025
Простенько, конечно, но думаю, сойдет.

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];

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

        for (int second = firstArray.length; second < resultArray.length; second++) {
            resultArray[second] = secondArray[second - firstArray.length];
        }

        for (int i = 0; i < resultArray.length; i++) {
            System.out.print(resultArray[i] + ", ");
        }
    }
}
Игорь Лупац Уровень 21
17 августа 2025
У нас несколько зеркально вышло: 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]; for (int i = 0; i < firstArray.length; i++) { resultArray[i] = firstArray[i]; } for (int i = 0; i < secondArray.length; i++) { resultArray[i + firstArray.length] = secondArray[i]; } for (int i = 0; i < resultArray.length; i++) { System.out.print(resultArray[i] + ", "); } } }
Dmitry Terekhov Уровень 24
18 августа 2025
Бывает 🙃
Eugene Volkov Уровень 35
10 сентября 2025
у меня компилятор ругался на сравнение типов моего аналога вашего first с firstArray.length . писало про сравнение разных типов данных(
Магомед Уровень 7
14 ноября 2025
Небольшое отличие. Я просто вывел объявление "int a" за скобки и использовал эту переменную в двух циклах package com.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 [ firstArray.length + secondArray.length]; int a; // -------------------------------вот тут for ( a = 0; a <; firstArray.length; a++ ) { resultArray [a] = firstArray[a]; } for (; a < resultArray.length; a++ ){ resultArray [a] = secondArray[a-firstArray.length];} for (int i = 0; i < resultArray.length; i++) { System.out.print(resultArray[i] + ", "); } } }
Anton Zorin Уровень 21
13 августа 2025

System.arraycopy(
    Object src,  // исходный массив
    int srcPos,  // начальная позиция в исходном массиве
    Object dest, // целевой массив
    int destPos, // начальная позиция в целевом массиве
    int length   // количество копируемых элементов
);
Antonina Уровень 6
22 июля 2025
Нашла изящное решение:

resultArray = IntStream.concat(Arrays.stream(firstArray), Arrays.stream(secondArray))
                .toArray();

        System.out.println("Результат: " + Arrays.toString(resultArray));