Многомерный массив с нулевой длиной
Я знаю, что подобные вопросы задавались несколько раз, и они были приятно ответили, но... они были примерно равны нулю в массиве размером 1 размер, например:
int[] array = new int[0];
Кажется, что существует такая цель для таких массивов в случае, когда null не должен/не может использоваться. Но почему Java позволяет создавать такие вещи:
int[][][] multiDims = new int[5][0][9];
Конечно, как в простом 1D случае мы ничего не получаем от такого массива, если пытаемся перебрать или что-то еще, и я спрашиваю только потому, что он выглядит очень неприятным для меня.:-)
Сколько памяти выделено для такого бессмысленного существа?
Ответы
Ответ 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
. Но это создаст еще один особый случай в спецификации и реализации, и преимущество будет очень маленьким.