Возьмем, к примеру, примитивный тип int
. Есть несколько способов объявить и массив int
:
int[] i = new int[capacity];
int[] i = new int[] {value1, value2, value3, etc};
int[] i = {value1, value2, value3, etc};
, где во всех этих случаях вы можете использовать int i[]
вместо int[] i
.
С отражением вы можете использовать (Type[]) Array.newInstance(Type.class, capacity);
Обратите внимание, что в параметрах метода ...
означает variable arguments
. По сути, любое количество параметров в порядке. Это проще объяснить с помощью кода:
public static void varargs(int fixed1, String fixed2, int... varargs) {...}
...
varargs(0, "", 100); // fixed1 = 0, fixed2 = "", varargs = {100}
varargs(0, "", 100, 200); // fixed1 = 0, fixed2 = "", varargs = {100, 200};
Внутри метода varargs
рассматривается как обычный int[]
. Type...
может использоваться только в параметрах метода, поэтому int... i = new int[] {}
не будет компилироваться.
Обратите внимание, что при передаче int[]
методу (или любому другому Type[]
) вы не можете использовать третий способ. В операторе int[] i = *{a, b, c, d, etc}*
компилятор предполагает, что {...}
означает int[]
. Но это потому, что вы объявляете переменную. При передаче массива в метод, объявление должно быть либо new Type[capacity]
, либо new Type[] {...}
.
Многомерные массивы
С многомерными массивами гораздо сложнее иметь дело. По сути, двумерный массив является массивом массивов. int[][]
означает массив int[]
с. Ключ заключается в том, что если int[][]
объявлено как int[x][y]
, максимальный индекс равен i[x-1][y-1]
. По сути, прямоугольник int[3][5]
это:
[0, 0] [1, 0] [2, 0]
[0, 1] [1, 1] [2, 1]
[0, 2] [1, 2] [2, 2]
[0, 3] [1, 3] [2, 3]
[0, 4] [1, 4] [2, 4]