У меня есть проблема с пониманием этой части кода:
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