Подтвердить что ты не робот

Многомерный массив с нулевой длиной

Я знаю, что подобные вопросы задавались несколько раз, и они были приятно ответили, но... они были примерно равны нулю в массиве размером 1 размер, например:

int[] array = new int[0];

Кажется, что существует такая цель для таких массивов в случае, когда null не должен/не может использоваться. Но почему Java позволяет создавать такие вещи:

int[][][] multiDims = new int[5][0][9];

Конечно, как в простом 1D случае мы ничего не получаем от такого массива, если пытаемся перебрать или что-то еще, и я спрашиваю только потому, что он выглядит очень неприятным для меня.:-) Сколько памяти выделено для такого бессмысленного существа?

4b9b3361

Ответ 1

Что касается того, почему Java допускает это - с точки зрения языка (а не понятий, которые вы пытаетесь выразить с ним), почему это конкретно запрещает это? Если вы разрешаете массив нулевой длины любого типа, зачем конкретно запрещать массив с нулевой длиной int[9]? Отказ от этого потребовал бы больше проверок компилятора для принудительного применения правила, которое в основном бесполезно, потому что даже без правила поведение корректно определено.

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


Отредактировано для добавления:

Как указано в комментариях, такая проверка даже не возможна, поскольку длина массива не является частью информации о типе и может быть задана во время выполнения. Таким образом, помимо "специального случая", когда int[0] непосредственно в исходном коде, компилятор даже не имеет средств знать, является ли он массивом нулевой длины.

Ответ 2

Это создаст 6 объектов - 5 пустых массивов и массив, содержащий эти массивы.

Почему это разрешено? По той же причине, что и в случае одномерных массивов. Если вы создадите такой массив:

int[][][] multiDims = new int[p][q][r];

где каждый p, q и r может быть иногда 0, обработка этих особых случаев будет очень сложной. Вместо этого вы получаете законный объект, который может использоваться в цикле (очень короткий цикл - тот, который заканчивается немедленно, но без ошибок).

Ответ 3

[5] действительно делает что-то полезное: самый внешний массив будет иметь пять массивов элементов с длиной 0.

Но вы правы в [9]. Он ничего не делает: поскольку все пять промежуточных массивов будут пустыми, массив длиной 9 не будет создан. Любое целое может быть помещено туда точно так же.

Язык мог быть спроектирован таким образом, что если бы существовал один уровень вложенного массива с размером, установленным в literal 0, то все последующие уровни также должны были бы быть установлены буквально 0. Но это создаст еще один особый случай в спецификации и реализации, и преимущество будет очень маленьким.