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

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

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

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

Например:

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

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

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

4b9b3361

Ответ 1

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

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

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

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


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

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

Ответ 2

Я собираюсь выйти на конечность и ответить на этот вопрос, однако нет правильного ответа на этот широкий вопрос.

Сначала нужно спросить, что делает массив многомерным?

Я собираюсь предположить, что ваш интервьюер рассматривает многомерный массив с фиксированным размером (как вы показали в своем вопросе), где его нельзя считать "зубчатым". Согласно Microsoft, массив jagged в С# выглядит следующим образом:

Элементы зубчатого массива могут иметь разные размеры и размеры.

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

An ArrayList поддерживается массивом; однако массив расширяется, когда к нему добавляется определенное количество элементов. По этой причине ArrayList может стать неровным и может считаться не более многомерным.

Изменить: перечитав все несколько раз, я уверен, что ваш интервьюер просто пытался вас смутить. Честно говоря, не имеет смысла, чтобы один тип данных (массив) был многомерным, а другой тип данных (a ArrayList, который использует массив) не должен быть многомерным.

Ответ 3

По той же причине сумка для покупок, в которую я положил все свои запасные сумки, не является многомерной сумкой для покупок.

Если я поставлю гайку в один мешок, тогда положите этот мешок в другой мешок, я должен выполнить две операции, чтобы получить гайку.

Если я вместо этого поставлю гайку в лоток двухмерных компонентов, я могу выполнить одну операцию для доступа к ней, используя два индекса:

лоток для компонентов источник

Аналогично, существует фундаментальное различие между списком списков (или массивом массивов) и истинным двухмерным массивом - для доступа к элементам в двумерном массиве используется одна операция с двумя индексами, две операции, каждая из которых принимает один индекс используется для доступа к элементам в списке списков.

ArrayList имеет единственный индекс, поэтому он имеет ранг 1. Двумерный массив имеет два индекса, его ранг равен 2.

note: by 'two dimension array' Я не имею в виду массив Java (ссылки на) массивы, а двухмерный массив, найденный на других языках, таких как FORTRAN. Java не имеет многомерных массивов. Если ваш интервьюер специально ссылался на массивы массивов Java, тогда я бы не согласился с ними, так как Java int[][] определяет массив ссылок на массивы целых чисел, а для доступа к элементам требуются две операции разыменования. Массив массивов в C, например, поддерживает доступ с помощью одной операции разыменования, поэтому ближе к многомерному случаю.

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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