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

Значением массива может быть все, что угодно, в том числе массив(ссылка на массив). В этом случае синтаксис может выглядеть немного необычно, поэтому разберем его отдельным уроком. Создать массив в массиве можно разными способами:

  • Пустой массив: int[][] multi = new int[42][42];
  • Заполненный массив:
int[][] ar = {
    {1, 2}, 
    {3, 4}
};

Каждый элемент, являющийся массивом, рассматривается как единое целое, что видно по размеру второго массива. То есть если раньше при вызове ar[0] мы получали первым элементом массива число, то теперь первым элементом массива будет тоже массив. Обращение ко вложенным массивам выглядит уже немного необычно, хотя и логично:

import java.util.Arrays;

String[][] strings = {{"cheeki", "breeeki"}, {"v damki"}};
String[] first = strings[0];
System.out.println(Arrays.toString(first)); // => [cheeki, breeeki]
System.out.println(strings[1][0]); // => v damki 

Обратите внимание что вложенные массивы не обязательно должны быть одинакового размера(как в примере выше).

Вложенность никак не ограничивается. Можно создавать массив массивов массивов и т. д. Возможно, с непривычки вы не всегда сразу точно увидите, как добраться до нужного элемента, но это всего лишь вопрос тренировок.

Изменение и добавление массивов в массив выполняется без сюрпризов. Все, что меняется - значение справа становится массивом. A вложенные массивы можно изменять напрямую, просто обратившись к нужному элементу:

import java.util.Arrays;

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

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

System.out.println(Arrays.deepToString(matrix)); // => [[4, 5, 6], [1, 2, 3], [7, 8, 9]]

matrix[2][0] = 0;
matrix[2][1] = 0;
matrix[2][2] = 0;

System.out.println(Arrays.deepToString(matrix)); // => [[4, 5, 6], [1, 2, 3], [0, 0, 0]]

Копирование

Для копирования многомерных массивов не существует метода в стандартной библиотеке, придется скопировать все вложенные массивы поэлементно, а при использовании важно помнить что этот метод скопирует ссылки на вложенные массивы, но не их содержимое:

int[][] matrix = {
        {1, 2, 3},
        {4, 5, 6}
};

int[][] copy = Arrays.copyOf(matrix, matrix.length);

matrix[1][0] = 0; 
matrix[1][1] = 0; //изменяется значение доступное по ссылке matrix[1], которое доступно
также по ссылке copy[1]

System.out.println(Arrays.deepToString(copy)); // => [[1, 2, 3], [0, 0, 6]]

Подобные сложные изменения состояния могут быть плохо понятны, мы рекоменуем использовать сайт pythontutor.com для визуализации, например попробуйте для кода выше Правильное копирование вложенного массива будет выглядеть так:

public static int [][] deepCopy(int[][] ar) {
    int[][] result = new int[ar.length][];
    for(int i = 0; i < ar.length; i++) {
        result[i] = Arrays.copyOf(ar[i], ar[i].length);
        }
    return result;
}

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

int [][] realCopy = deepCopy(matrix);
matrix[0] = null;
matrix[1][0] = 0;

System.out.println(Arrays.deepToString(realCopy)); // => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

System.out.println(Arrays.deepToString(matrix)); // => [null, [0, 5, 6], [7, 8, 9]]

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

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →