У меня есть проблема с пониманием этой части кода:
int[] it = new int[][]{{1}}[0];
Почему это скомпилировано и как я могу понять такое объявление?
У меня есть проблема с пониманием этой части кода:
int[] it = new int[][]{{1}}[0];
Почему это скомпилировано и как я могу понять такое объявление?
Что вы здесь делаете:
int[] it
(которая является одномерным массивом)[0]
new int[][]
{{1}}
Таким образом, вы создаете двумерный массив, который вы инициализируете, чтобы он содержал массив, содержащий 1
, и в то же время вы берете первый элемент внешнего массива (который является одномерным массивом, содержащим 1
) и назначаете его к вашей переменной.
int[] it = new int[][]{{1}}[0];
Давайте разберем это на каждом этапе и что это значит.
new int[][]
Это новый многомерный массив.
{{1}}
Это многомерный литерал массива. Он создает массив, который выглядит следующим образом:
[0] = [1]
[1] = []
[2] = []
...
[N] = []
Итак, обратите внимание, каждый элемент в этом массиве сам является массивом. Затем вы указали, что ваша переменная it
равна первому массиву в многомерном массиве, поэтому она напрямую равна:
int[] it = new int[] {1};
new int[][]{{1}}
выделяет новый массив 1x1 2D. Элементу (only) установлено значение 1.
[0]
возвращает ссылку на первую (и единственную) строку, которая имеет тип int[]
.
int[] it = ...
объявляет переменную и инициализирует ее ссылкой выше.
Конечный результат эквивалентен int[] it = new int[]{1}
.
По существу, вы создаете анонимный двумерный массив (new int[][]{{1}}
), а затем берете первый элемент этого двумерного массива ({1}
) и присваиваете его переменной it
.
Отпустите шаг за шагом, потому что это на самом деле путается.
new int[][]{{1}}
: создается двумерный массив, который имеет только один элемент: массив, содержащий один массив, содержащий один int
(номер 1). Поскольку он не присваивается переменной нигде и не будет доступен через этот оператор, мы называем его "анонимным", и он имеет наименьшую возможную область.
[0]
: этот доступ к первому элементу анонимного двумерного массива, который мы создали выше. Первый элемент представляет собой одномерный массив, содержащий 1 (т.е. {1}
).
int[] it =
: Наконец, здесь мы берем полученный одномерный массив и сохраняем его в нашей переменной.
В качестве побочной заметки нет абсолютно никаких оснований для этого, и это похоже на очень интересную Java-загадку.
Я попытаюсь сломать его
new int[][] // an array of arrays (or 2-dimensional array)
{1} // an array instance with a single element: 1
{{1}} // an array instance with a single element: above array instance
[0] // the first element of an array
Таким образом, это примерно эквивалентно следующему коду:
int[] inner = new int[1]; // an empty array with length 1
inner[0] = 1;
int[][] outer = new int[1][];
outer[0] = inner;
int[] it = outer[0];
int[] it = new int[][]{{1}}[0];
Целый массив it
получает следующее:
new int[][] // A new 2D array is created
{{1}} // This is an initializer. The first array in the first array gets an array of 1 item: '1'
[0] // Take the first array from the 2D array