java - элемента - Почему ArrayList из ArrayLists не является многомерным?




удаление элемента arraylist java (5)

Глядя на это с другой стороны: вы можете использовать списки так же, как и «многомерные» массивы. Вам нужно заменить array[row][column] на someList.get(row).get(column) !

И, в конце концов, массивы java реализованы аналогичным образом: двухмерная матрица - это всего лишь один тусклый массив из одного тусклого массива! Другими словами: разница больше на поверхности, не укоренившейся в глубоких концептуальных причинах!

И чтобы быть действительно точным: система типа Java позволяет вам помещать Object[][] поэтому в этом смысле она знает этот тип Object[][] ; но, как сказано, в действительности нет многомерных массивов; поскольку Java видит, что «две тусклые» вещи являются массивом ссылок на массивы!

С другой стороны: существует определенное понятие «многомерные массивы», как, например, спецификация JVM явно упоминает:

Первым операндом команды multianewarray является индекс пула константы времени выполнения для создаваемого типа класса массива. Во-вторых, это число измерений этого типа массива, которое нужно создать. Команда multianewarray может использоваться для создания всех измерений типа, как показывает код для create3DArray. Обратите внимание, что многомерный массив является всего лишь объектом и поэтому загружается и возвращается командой aload_1 и isturn соответственно.

Недавно я появился на собеседование, в котором интервьюер задал мне вопрос о Arrays и ArrayList .

Он спросил меня, может ли массив массивов быть многомерным, тогда почему ArrayList из ArrayList не является многомерным?

Например:

// Multidimensional
int[][] array = new int[m][n]; 

// Not multidimensional
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>(); 

Может ли кто-нибудь помочь мне понять это?


Кей С. Хорстманн заявил в своей книге Core Java для нетерпеливых :

В Java нет двумерных списков массивов, но вы можете объявить переменную типа ArrayList<ArrayList<Integer>> и сами создать строки.

из-за того, что ArrayList может расширяться и сжиматься и становиться зубчатым, а не многомерным, можно сказать, что это не двумерный массив, многомерный смысл фиксированных строк и столбцов, поэтому я также заявил в комментариях Java не имеет истинных многомерных массивов, но это выходит за рамки вашего вопроса.

если вам интересно, почему я сказал, что Java не имеет истинных многомерных массивов, читайте различие между многомерным массивом и массивом массивов в C #?

Просто чтобы я смог получить более четкое представление о том, имеет ли Java истинные многомерные массивы или нет, я не сказал, что у java нет многомерных массивов, я сказал, что Java не имеет истинных многомерных массивов и, как ожидается, JLS заявил:

Для многомерного массива не должно быть массивов одинаковой длины на каждом уровне.


Потому что он не является размерным вообще. Это объект с API. Любое появление многомерности обеспечивается его API, но оно чисто в глазах смотрящего. Массив, с другой стороны, является размерным и поэтому может быть многомерным.


Требование интервьюера бессмысленно.

Можно утверждать, как вы видите на этой странице, что Java не имеет истинных многомерных массивов, и в этом случае он также не имеет многомерных ArrayLists. С другой стороны, это, безусловно, позволяет вам представлять многомерные структуры через массивы и ArrayLists таким же образом.

Определить основное различие между ними достаточно произвольно и бессмысленно.

Возможно, интервьюер просто пытался начать технические дебаты, чтобы проверить вашу способность объяснить детали.


ArrayList - это реализация List . Это List который реализуется с использованием массивов. Использование массивов - это детализация реализации. Интерфейс List не поддерживает концепцию многомерных списков, поэтому вы не ожидали бы и ArrayList . Далее он не рассматривается как пример традиционной структуры данных списка .

Массивы поддерживают многомерность, потому что это языковая функция Java.







multidimensional-array