JavaRush /Курсы /JAVA 25 SELF /Зубчатые массивы (Jagged Arrays)

Зубчатые массивы (Jagged Arrays)

JAVA 25 SELF
7 уровень , 4 лекция
Открыта

1. Зубчатые массивы отличаются от двумерных

Вот мы и дошли до темы, которую многие называют «зубчатыми массивами» — по-английски jagged arrays. В отличие от двумерных массивов, зубчатые массивы позволяют хранить колонки разной длины. Это как если бы у вас был комплекс зданий, где у каждого здания своё количество квартир — в одном здании 5 квартир, в другом 20, а в третьем — всего одна.

Зубчатый массив — это массив, каждый элемент которого является массивом, и при этом вложенные массивы (их ещё называют «подмассивы») могут иметь разную длину.

Главное отличие:

  • В двумерном массиве у каждой «строки» (и у каждого «столбца») одинаковое количество элементов. Пример: int[][] grid = new int[3][5]; — у нас всегда 3 строки по 5 элементов.
  • В зубчатом массиве каждая строка может быть разной длины! Пример: int[][] jagged = new int[3][]; — и только потом мы каждую строку (подмассив) инициализируем по‑своему.

Вот как это выглядит визуально:

Двумерный массив (3x3):
┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┴───┴───┘

Зубчатый массив (разные длины):
┌───┬───┐
│ 1 │ 2 │
├───┼───┼───┬───┐
│ 3 │ 4 │ 5 │ 6 │
├───┼───┴───┴───┘
│ 7 │
└───┘

2. Синтаксис объявления и инициализации зубчатого массива

Объявление зубчатого массива не страшнее, чем объявления предыдущих типов! Пугаться двойных квадратных скобок не стоит:


int[][] jaggedArray = new int[3][];
Объявление зубчатого массива: внешний размер задан, внутренние массивы ещё не созданы

Это значит, что у нас есть массив из 3 элементов, и каждый из них — это тоже массив int-ов. Но пока что внутренние массивы не созданы! Для лучшего понимания давайте разберём это подробнее.

Пошаговая инициализация зубчатого массива

Шаг 1 — создание основного (внешнего) массива:

int[][] jaggedArray = new int[3][];

Теперь у нас есть 3 «строки», но все они пока равны null.

Шаг 2 — создание и заполнение внутренних массивов (подмассивов):
Например, пусть первая строка будет длиной 2, вторая — 4, третья — 3:

jaggedArray[0] = new int[2]; // 2 элемента в первой строке
jaggedArray[1] = new int[4]; // 4 элемента во второй строке
jaggedArray[2] = new int[3]; // 3 элемента в третьей строке

Шаг 3 — заполнение значениями:
Внутренние массивы — это обычные массивы! Например:

jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;

jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
jaggedArray[1][2] = 5;
jaggedArray[1][3] = 6;

jaggedArray[2][0] = 7;
jaggedArray[2][1] = 8;
jaggedArray[2][2] = 9;

Краткая инициализация зубчатого массива

Можно создать и заполнить зубчатый массив сразу, если вы знаете значения заранее:

int[][] jaggedArray = new int[][]
{
    new int[] { 1, 2 },
    new int[] { 3, 4, 5, 6 },
    new int[] { 7, 8, 9 }
};

Или чуть короче, опуская тип внутренних массивов:

int[][] jaggedArray = 
{
    { 1, 2 },
    { 3, 4, 5, 6 },
    { 7, 8, 9 }
};

3. Перебор и работа с зубчатыми массивами

Перебирать зубчатый массив — не сложнее, чем двумерный, но теперь внешний цикл идёт по строкам, а внутренний — по элементам строки (которые могут иметь разную длину):

for (int i = 0; i < jaggedArray.length; i++) 
{
    System.out.println("Строка " + i + ":");
    for (int j = 0; j < jaggedArray[i].length; j++) 
    {
        System.out.print(jaggedArray[i][j] + " ");
    }
    System.out.println();
}

Итог на экране:

Строка 0:
1 2 
Строка 1:
3 4 5 6 
Строка 2:
7 8 9 

Можно использовать for-each, чтобы не думать об индексах:

for (int[] row : jaggedArray) 
{
    for (int value : row) 
    {
        System.out.print(value + " ");
    }
    System.out.println();
}

4. Типичные сценарии применения зубчатых массивов

Когда зубчатый массив может быть полезнее двумерного?

  • Если вы храните для каждого пользователя разное количество каких-то данных: оценки по предметам, покупки, комментарии и так далее.
  • Если ваши данные имеют треугольную или ступенчатую структуру (например, для вывода пирамидок, треугольников Паскаля и др.).
  • Если хотите экономить память: в двумерном массиве все строки фиксированы, а в зубчатом — только нужное количество элементов.

Пример из жизни: менеджер оценок студентов

Предположим, у нас есть три студента, и вот их оценки за разные задания по математике:

Студент Оценки
0 5, 4
1 3, 4, 4
2 5

Объявим такой массив:

int[][] studentMarks = new int[3][];
studentMarks[0] = new int[] { 5, 4 };         // Первый студент — 2 оценки
studentMarks[1] = new int[] { 3, 4, 4 };      // Второй студент — 3 оценки
studentMarks[2] = new int[] { 5 };            // Третий студент — 1 оценка

Выведем оценки каждого студента:

for (int i = 0; i < studentMarks.length; i++) 
{
    System.out.print("Студент " + i + ": ");
    for (int j = 0; j < studentMarks[i].length; j++) 
    {
        System.out.print(studentMarks[i][j] + " ");
    }
    System.out.println();
}

Использование зубчатых массивов с другими типами

Зубчатым может быть массив чего угодно: строк, массивов других массивов (глубже!), даже ваших собственных объектов.

Пример: массив строк

String[][] groups = {
    { "Иван", "Пётр" },
    { "Мария", "Алексей", "Сергей" },
    { "Василиса" }
};

5. Трёхмерные и многомерные массивы

И ещё один интересный факт о массивах, о котором вы, наверное, уже догадываетесь. Если можно сделать двумерный массив, значит, можно сделать и трёхмерный?

Да, можно создать массив любой размерности. Такие массивы называют многомерными.

Как объявлять многомерные массивы

Достаточно просто перечислить нужное количество размеров через скобки:

int[][][] cube = new int[2][3][4]; // 2 "слоя", 3 строки, 4 столбца
cube[0][1][2] = 99;

Здесь у нас трёхмерный массив:

  • 2 элемента по первой координате,
  • 3 — по второй,
  • 4 — по третьей.

Такой массив — это один большой «куб» данных, упакованный последовательно.

Перебор трёхмерного массива

Доступ к элементу осуществляется по всем индексам сразу:

for (int i = 0; i < cube.length; i++) 
{
    for (int j = 0; j < cube[i].length; j++) 
    {
        for (int k = 0; k < cube[i][j].length; k++) 
        {
            System.out.print(cube[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println("---");
}
  • Индексы нумеруются с нуля, как всегда в Java.
  • Всего в таком массиве будет 2 × 3 × 4 = 24 элемента.

Практические примеры многомерных массивов

  • 2D — таблицы, шахматные доски, изображения.
  • 3D — «кубики» в компьютерной графике, данные для научных расчётов (например, температура в разных точках пространства и времени).
  • 4D и выше — редко используются, но встречаются в продвинутой математике, симуляциях, машинном обучении и пр.

6. Типичные ошибки при работе с многомерными массивами

Ошибка №1: Выход за границы массива

Самая популярная ошибка — попытка обратиться к несуществующему элементу, например:

int[][] arr = new int[2][3];
arr[2][0] = 5; // Ошибка! Нет строки с индексом 2 (есть только 0 и 1)
arr[0][3] = 7; // Ошибка! Нет столбца с индексом 3 (есть только 0, 1, 2)

При таком обращении программа выбросит ArrayIndexOutOfBoundsException. Всегда проверяйте, что индексы в допустимых пределах: от 0 до длина - 1.

Ошибка №2: Неинициализированные строки в зубчатом массиве

Если создать зубчатый массив и забыть инициализировать внутренние массивы, при попытке обращения будет NullPointerException:

int[][] jagged = new int[3][];
jagged[0][0] = 5; // Ошибка! jagged[0] == null

Сначала нужно создать внутренний массив: jagged[0] = new int[2];

Ошибка №3: Неверное использование длины массива

Путают matrix.length (количество строк) и matrix[0].length (количество столбцов). Особенно часто — при копировании, переборе, суммировании по столбцам.

Ошибка №4: Предположение, что все строки одинаковой длины

В зубчатых массивах строки могут быть разной длины! Если вы пишете matrix[i][j], убедитесь, что j < matrix[i].length.

Ошибка №5: Путаница в порядке индексов

Иногда путают, что первым идёт строка, а потом столбец: matrix[строка][столбец]. Не наоборот!

1
Задача
JAVA 25 SELF, 7 уровень, 4 лекция
Недоступна
Гибкая система достижений игрока 🏅
Гибкая система достижений игрока 🏅
1
Задача
JAVA 25 SELF, 7 уровень, 4 лекция
Недоступна
Список гостей на праздничном ужине 🥂
Список гостей на праздничном ужине 🥂
1
Задача
JAVA 25 SELF, 7 уровень, 4 лекция
Недоступна
Общий счет игрока в мини-играх 🎮
Общий счет игрока в мини-играх 🎮
1
Задача
JAVA 25 SELF, 7 уровень, 4 лекция
Недоступна
Самая жаркая точка в здании по показаниям датчиков 🔥
Самая жаркая точка в здании по показаниям датчиков 🔥
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Gans Electro Уровень 29
27 мая 2026
Вот 6 мерный массив: int[][][][][][] x = new int[2] [2] [3] [5] [2] [3] Первое число 2 отдельных коммента Второе число 2 слоя на каждом комменте Третье число 3 строк в 4 мерном массиве Четвертое число 5 столбцов в 4 мерном массиве Последние [2][3] обычный двумерный массив вида: { 1, 2, 3 }, { 4, 5, 6 } Комментарий 1 --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 1 коммента 1 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 2 коммента 1 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | ---------------------------------------------------------------------------------------
Gans Electro Уровень 29
27 мая 2026
Коммент 2 --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 1 коммента 2 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 2 коммента 2 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | ---------------------------------------------------------------------------------------
Gans Electro Уровень 29
27 мая 2026
Или так: --------------------------------------- --------------------------------------- | 0 1 | | 0 1 | | 0 { 1, 2, 3 } { 1, 2, 3 } | | 0 { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } | | { 4, 5, 6 } { 4, 5, 6 } | | | | | | 1 { 1, 2, 3 } { 1, 2, 3 } | | 1 { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } | | { 4, 5, 6 } { 4, 5, 6 } | --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- | 0 1 | | 0 1 | | 0 { 1, 2, 3 } { 1, 2, 3 } | | 0 { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } | | { 4, 5, 6 } { 4, 5, 6 } | | | | | | 1 { 1, 2, 3 } { 1, 2, 3 } | | 1 { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } | | { 4, 5, 6 } { 4, 5, 6 } | --------------------------------------- ---------------------------------------
Даниил Уровень 8
3 мая 2026
Решил первую задачу используя рандомайзера. Это круто на этом этапе обучения?)

package ru.javarush.java.core.level07.task13;
import java.util.Random;
public class Solution {
    public static void main(String[] args) {
       Random random = new Random();
        // Создаем зубчатый массив (каждая "строка" может иметь свою длину)
        int[][] playerAchivements = new int[3][];
            playerAchivements[0] = new int[2]; // 1-й уровень: 2 достижения
            playerAchivements[1] = new int[4];   // 2-й уровень: 4 достижения
            playerAchivements[2] = new int[1];    // 3-й (бонусный) уровень: 1 достижение
            
        // Выводим каждую строку массива на отдельной строке
            for (int i = 0; i < playerAchivements.length; i++) {
                for (int k = 0; k < playerAchivements[i].length; k++) {
                    int number = random.nextInt(10);
                    playerAchivements[i][k] += number;
                }
            }
        // Печатаем элементы строки, разделяя пробелом
        for (int[] row : playerAchivements) {
            for (int local : row) {
                System.out.print(local + " ");
            }
            System.out.println();
        }
        // перед первым элементом пробел не ставим


        // перенос строки после каждой "строки" массива


    }
}
Anonymous #6456471 Уровень 13
21 мая 2026
круто но мог бы без переменной number, чтоб не выделять еще ячейку памяти playerAchievements[row][col] = new Random().nextInt(100) + 1;
Victor Уровень 23
3 апреля 2026
четырёхмерный массив - это склад озона где свалены коробки разных размеров, к тому же зубчатый
C0N5P1RACY Уровень 1
3 ноября 2025
Пытался представить 4х мерный массив... P.S. Переживаю за парня, которому было тяжело на первых лекциях... кста, 4х мерный массив легче всего представить как два отдельных куба, чем как куб-в-кубе, хотя тем кто живет в 4м измерении наверно куб-в-кубе проще...
x4Sting Уровень 9
13 ноября 2025
Любой n-мерный массив проще не визуализировать, а понимать, что это контейнеры в которых хранятся контейнеры
Gans Electro Уровень 29
27 мая 2026
Могу показать 4 мерный массив. int[][][][] x = new int[3] [5] [2] [3]; 0 1 2 3 4 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } Это двумерный массив из двумерных массивов.
Gans Electro Уровень 29
27 мая 2026
Вот 5 мерный: int[][][][][] x = new int[2] [3] [5] [2] [3]; --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 1 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- | 0 1 2 3 4 | | 0 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | слой 2 | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 1 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | | | 2 { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } { 1, 2, 3 } | | { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } { 4, 5, 6 } | ---------------------------------------------------------------------------------------
Valeriy Уровень 1
29 сентября 2025
Mission complete.
SB Уровень 33
6 апреля 2026
the same here! )