JavaRush /Курсы /JAVA 25 SELF /Двумерные массивы

Двумерные массивы

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

1. Введение

Представьте себе обычный массив как длинный ящик из-под пиццы, где все кусочки лежат в ряд — вкусно, но однообразно.

А теперь представим расписание работ или шахматную доску. Там уже всё организовано в строки и столбцы — то есть в таблицу. Вот это и есть классическая задача для двумерного массива.

В реальной жизни двумерные массивы встречаются на каждом шагу:

  • Таблицы с зарплатами сотрудников (строки — сотрудники, столбцы — месяцы).
  • Картинка на экране (каждая "клетка" — цвет пикселя, у нее две координаты: X и Y).
  • Матричные вычисления и обработка данных.
  • Шахматная доска или поле для крестиков-ноликов.

Иногда двумерный массив называют матрицей (это название пришло из математики).

Есть очень много мест, где вам как программисту может понадобиться двумерный массив. Реализация практически любой настольной игры — это готовый двумерный массив: «Шахматы», «Шашки», «Крестики-нолики», «Морской бой»:

Двумерные массивы 2

Игровое поле «Шахмат» или «Морского боя» такое, что оно просто идеально ложится на двумерные массивы, где в качестве координат клеток нужно будет использовать только числа. Не «пешка e2 ⟶ e4», а «пешка (4,1) ⟶ (4,3)». Вам как программисту так будет даже проще.

2. Синтаксис объявления двумерных массивов

Страшно только до первого объявления! Разбираемся шаг за шагом.

Общее правило


тип[][] имяМассива;
Объявление двумерного массива в Java

Здесь две пустые [] скобки — не ошибка компилятора после ночи с кофе, а указание: массив двумерный.

Примеры

int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;

Создание массива

Задаём размеры: количество строк и столбцов.

matrix = new int[3][4]; // 3 строки, 4 столбца

Это табличка 3x4: представьте Excel-таблицу с 3 строками и 4 колонками.

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

int[][] matrix = new int[3][4];

Можно инициализировать сразу значениями (примерно как с одномерным):

int[][] example = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
// Таблица 3 строки, 3 столбца
Инициализация двумерного массива значениями

Визуальная схема

┌─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  ← столбцы (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │  ← строка 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │  ← строка 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │  ← строка 2 (Row 2)
└─────┴─────┴─────┴─────┘

Каждый элемент задаётся парой индексов [строка, столбец].

3. Индексация и доступ к элементам

В двумерном массиве для доступа к элементу указываются два индекса:

  • Первый — номер строки.
  • Второй — номер столбца.

      // Во второй строке (индекс 1), третий столбец (индекс 2)
      matrix[1][2] = 99;
Присваивание значения элементу двумерного массива

Если кто-то привык к шахматам, напомню: индексация начинается с нуля. То есть первый элемент — это [0][0].

Запись и чтение

int[][] data = new int[5][2];
data[1][1] = 5;         // запись
int value = data[1][1]; // чтение

Вот как это будет выглядеть в памяти:

Двумерные массивы

4. Заполнение двумерного массива

Давайте напишем код, который заполнит матрицу последовательными числами от 1 до 12, чтобы стало понятно, как это работает.

int[][] matrix = new int[3][4];
int value = 1;

for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 4; col++)
    {
        matrix[row][col] = value;
        value++;
    }
}
Заполнение двумерного массива числами по порядку

Иллюстрация:

После выполнения:
┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┼────┼────┼────┤
│ 5  │ 6  │ 7  │ 8  │
├────┼────┼────┼────┤
│ 9  │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘

5. Устройство двумерных массивов

А сейчас вы узнаете, как на самом деле устроены двумерные массивы. Готовы?

Двумерные массивы — это на самом деле массивы массивов!

Другими словами, если в случае с обычным массивом «переменная-массив хранит ссылку на контейнер, который хранит элементы массива», то в случае с двумерными массивами у нас ситуация немного взрывоопаснее: переменная-двумерный-массив хранит ссылку на контейнер, который хранит ссылки на одномерные массивы. Это лучше один раз увидеть, чем сто раз попробовать объяснить:

Устройство двумерных массивов

Слева у нас «переменная-двумерный-массив», которая хранит ссылку на «объект-двумерный массив». В середине у нас «объект двумерный массив», в ячейках которого хранятся ссылки на одномерные массивы — строки двумерного массива. Ну и справа вы видите четыре одномерных массива — строки нашего двумерного массива.

Это то, как на самом деле устроены двумерные массивы. И такой подход даёт Java-программисту несколько преимуществ:

Во-первых, т.к. «контейнер контейнеров» хранит ссылки на «массивы-строки», мы можем очень быстро и просто менять строки местами. Чтобы получить доступ к «контейнеру контейнеров», нужно просто указать один индекс вместо двух. Пример:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

Вот с помощью такого кода можно поменять строки местами:

// Важная матрица с данными
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;

Если вы обращаетесь к ячейке двумерного массива, но после имени массива указываете только один индекс, вы таким образом обратитесь к контейнеру-контейнеров, в ячейках которого хранятся ссылки на обычные одномерные массивы.

6. Вывод двумерного массива на экран

Для вывода двумерной таблицы обычно используют двойной цикл — и это всё равно что рисовать лабиринт в консоли. Пример:

for (int row = 0; row < matrix.length; row++) 
{
    for (int col = 0; col < matrix[row].length; col++) 
    {
        System.out.print(matrix[row][col] + "\t"); 
    }
    System.out.println(); // переход на новую строку
}

Пример вывода:

1	2	3	4	
5	6	7	8	
9	10	11	12	

Кстати, вот тут вы научились красиво "рисовать" таблицы с помощью пары строк кода!

1
Задача
JAVA 25 SELF, 7 уровень, 3 лекция
Недоступна
Схема мест в театральном зале 🎭
Схема мест в театральном зале 🎭
1
Задача
JAVA 25 SELF, 7 уровень, 3 лекция
Недоступна
Размещение приветственного сообщения на информационном табло 📢
Размещение приветственного сообщения на информационном табло 📢
1
Задача
JAVA 25 SELF, 7 уровень, 3 лекция
Недоступна
Автоматическое заполнение таблицы склада 📦
Автоматическое заполнение таблицы склада 📦
1
Задача
JAVA 25 SELF, 7 уровень, 3 лекция
Недоступна
Отображение данных с сенсорной сетки 📊
Отображение данных с сенсорной сетки 📊
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Павел Уровень 10
14 мая 2026
Здоровские задачи, спасибо!
KEN Уровень 13
13 апреля 2026
Может кто-нибудь попробует так решить эту задачу. Я просто решил уже другим способом, а потом мне пришла в голову мысль, и я решил ее таким способом, но теперь не могу проверить засчитает ли мне ее JAVARUSH.

package ru.javarush.java.core.level07.task12;

public class Solution {
    public static void main(String[] args) {
        int[][] sensorData = new int[2][5];
        int counter = 10;
        String a = "";
        for (int i = 0; i < sensorData.length; i++) {
            for (int j = 0; j < sensorData[i].length; j++) {
                sensorData[i][j] = counter++;
                a += sensorData[i][j] + " ";
            }
            a += "\n";
        }
        System.out.println(a.trim());
    }
}
Смысл в том, что я создал переменную строковую, и в конце каждой итерации наполняю ее данными, а потом когда мы ее наполним у нас будет в конце лишний пробел, и мы с помощью метода trim() удаляем пробел, вроде не плохо получилось тоже.
rwnmei Уровень 46
15 августа 2026

 int[][] sensorData = new int[2][5];
        // Начальное значение для заполнения массива
        for (int row = 0; row < 2; row++) {
            for (int col = 0; col < 5; col++) {
                sensorData[row][col] = row * 5 + col + 10;
                if (col == 4){
                    System.out.print(sensorData[row][col]);
                }else {
                    System.out.print(sensorData[row][col] + " ");
                }

            }
            System.out.println();
        }
Igor Dem Уровень 27
7 апреля 2026
для чего в 4ой задаче в правильном ответе два раз повторяется один и тот же цикл? for (int i = 0; i < sensorData.length; i++) { for (int j = 0; j < sensorData[i].length; j++) { sensorData[i][j] = value++; } } // Выводим массив в виде таблицы for (int i = 0; i < sensorData.length; i++) { for (int j = 0; j < sensorData[i].length; j++) { если можно просто сделать так: for (int i=0;i<sensorData.length; i++){ for (int y=0;y<sensorData[i].length; y++){ sensorData[i][y]=x++; System.out.print(sensorData[i][y]); if (y < sensorData[i].length - 1) { System.out.print(" ");
Кэрривайт Уровень 3
25 февраля 2026
Решила простенькую задачку по программированию самостоятельно (ну почти самостоятельно) и чувствую себя хакером. Еще пару месяцев позанимаюсь и пойду Пентагон взламывать
Ilya Pozdnyakov Уровень 13
11 февраля 2026
В последнем задании можно обойтись одним внешним и одним внутренним циклом, зачем одни нагородили столько циклов в "Правильном решении" - не очень понятно.
Stanislav Muzulev Уровень 21
11 января 2026
Клаасс) реально круто объяснили, за это жирный лайк лекции)
САН САНЫЧ Уровень 20
13 декабря 2025
+идем дальше!
Kismet Уровень 24
28 ноября 2025
треш
C0N5P1RACY Уровень 42
2 ноября 2025
Андрей Уровень 28
26 сентября 2025
"здесь две пустые [] скобки — не ошибка компилятора после ночи с кофе" не знал что компилятор любит кофе )
Юрий Уровень 24
12 февраля 2026
компилятор молодец - 2 полоски-скобки. А там вспоминай был ли кофе и компилировал он ночью.