2013-02-15 2 views
0

Это концептуальный вопрос, следующий за вопросом (here). Я недавно получил ответ. Я буду использовать пример java, чтобы продемонстрировать свой вопрос, но я думаю, что это должно уместиться для других подобных языков (я не мог сказать точно - надеюсь, кто-то может подтвердить это или сказать иначе). В основном я интересно, если есть какое-либо тонкое различие между возможными видами на следующем (учитывая то, как они инициализируются):Существуют ли какие-либо важные различия между этими двумя способами написания массивов?

double[] array1D = new double[max] 

и

double[][] array2D = new double [max][1] 

Предполагая, что мы инициализация второго массива, чтобы иметь только один столбец, действительно ли существует потребность в существовании массива 1D? Имеет ли он какое-либо качество, которое нет в 2D-массиве, или оно просто должно смутить бедных душ, подобных мне? Кроме того, я хотел бы знать, может ли array2D использовать только один столбец, что array1D не может?

+0

Оба массива одинаковы, единственное отличие состоит в том, что использование 2-го пути неуклюже (и если бы я был вами, я бы никогда не посмел использовать его, по крайней мере, для того, чтобы меня уволили) –

+0

Просьба уточнить, я не хочу, чтобы меня уволили, но я ненавижу делать что-то, не зная почему. – Magpie

+0

Нет ничего сложного. Я предполагаю, что если вы нарисуете массив на листе бумаги, а рядом с ним нарисуйте 2-й массив, где второе измерение - это одна строка, вы получите свой собственный ответ. –

ответ

2

Основное отличие между array1D и array2D заключается в том, что в последнем случае строки (или столбцы, однако вы хотите посмотреть на него) являются отдельными объектами, которые могут использоваться независимо от всего массива.

Например, вы можете передать целую строку функции, а функции разрешено изменять строку. Чтобы достичь этого с помощью массива 1D, вам придется передать исходный массив, начальный индекс строки в массиве и длину строки.

Каждая ссылка на объект стоит 4 байта, поэтому использование памяти увеличивается с 4 байтами для каждого элемента, поэтому отходы памяти используют 2D-массив для чего-то, что может сделать массив 1D.

+0

Так ли это означает, что было бы пустой тратой памяти на использование 2D-массивов на пути Я предположил, что они будут использоваться в моем вопросе? – Magpie

+0

Да, программа с 2D-массивом, как показано, также будет использовать больше памяти из-за накладных расходов на обертку каждого элемента в отдельном массиве.(Накладные расходы для массива составляют 4 байта для заголовка объекта и 4 байта для длины массива. Ссылка на объект - 4 байта, поэтому использование памяти увеличивается с 4 байтами для каждого элемента) – Joni

0

Оба будут делать то же самое. Кроме того, вам не нужно создавать 2-мерный массив, когда вам нужно всего лишь одна строка. 2-мерный массив используется, когда вам нужно работать с несколькими одномерными массивами.

Кроме того, я думаю, вы должны инициализировать ваш 2-мерная таким образом, чтобы достичь его, чтобы работать на 1-й массив

double[][] array2D = new double[1][max] 
0

Представьте это 1D массив

1 2 3 4 5 6 7 8 9 

и это представляет собой двумерную матрицу

1 
2 
3 
4 
5 
6 
7 
8 
9 
    1 2 3 4 5 6 7 8 9 

В основном, 2D-массив может хранить больше данных, чем 1D-массив, и более сложный, чем 1D-массив

+0

Говорить что-то более сложное не дает ответа – Magpie

0

У вас, похоже, есть неправильное представление о том, что для массивов обычно два измерения. Это неправда.

В языках программирования одномерные массивы являются нормой, в то время как двумерные и высшие размерные являются довольно редкими (я не могу вспомнить, когда я последний раз использовал их в Java).

Возможно использование двумерного массива вместо одномерного, но это скроет смысл массива и сделает доступ к элементам массива более сложным.

+0

Я вроде чувствую, что 1D-массив скрывает смысл 2D-массива (если вы читаете мою ссылку, я вам объясню). Более того, он может иметь более двух столбцов, поэтому не вводит в заблуждение, что он называется 2D-массивом или я что-то пропустил? – Magpie

1

новый двойной [макс] создает массив удваивается (инициализированную 0,0) с Lengh = макс

новый двойной [макс] [1] создает массив указателей каждый из них указывает на двойной массив с одним элемент = 0,0

+0

красиво положить. Я предполагаю, что это означает, что больше памяти используется без нужды? – Magpie

+0

, предполагая max = 10, тогда # 1 примет ~ 80 +16 байт; # 2 займет ~ 40 + 16 + (8 + 16) * 10. –

1
int A[2][3]={{1,2,3},{4,5,6}}; 

2D-массив хранится в памяти следующим образом. Записи в строке 0 сохраняются сначала, а затем строка 1 и т. Д.

enter image description here

2-D массивы представлены в виде непрерывного блока п блоков, каждый с размером м (т.е. может удержания м целых чисел (или любой тип данных) в каждом блоке). Записи хранятся в памяти, как показано выше.Здесь n представляет количество строк, а m представляет число столбцов .

В Java:

Как и во всех массивах, новое ключевое слово должно использоваться для выделения памяти для массива. Например,

int[][] a = new int[2][4]; 

Этот двумерный массив будет иметь две строки и четыре столбца. Это фактически выделяет 3 объекта: одномерный массив из 2 элементов для хранения каждого из массивов строк и двух одномерных массивов из 4 элементов для представления содержимого строк.

+-----+ +-----+-----+-----+-----+ 
|a[0] | -> | [0] | [1] | [2] | [3] | 
|  | +-----+-----+-----+-----+ In Java two-dimensional arrays are implemented is a 
             one-dimensional array of one-dimensional arrays -- like this. 
+-----+ 
|  | +-----+-----+-----+-----+ 
|a[1] | -> | [0] | [1] | [2] | [3] | 
+-----+ +-----+-----+-----+-----+ 

В вашем случае:

double[][] array2D = new double [max][1] 

Это фактически выделяет не более + 1 объекты: одномерный массив из максимальных элементов для хранения каждого из фактических массивов строк, а максимальный одномерные массивы 1 элемент для представления содержимого строк.

Дайте мне знать, если я wroung.

+0

n и m не указаны на картинке? – Magpie

+0

-1 Для Java это неверно, массив для первого индекса хранит указатели на массивы для второго индекса, которые содержат значения. В частности, внутренние массивы могут иметь разную длину. – starblue

+0

@ Magpie Изображение для int A [2] [3] = {{1,2,3}, {4,5,6}}; И описание для 2d массива в целом. –

Смежные вопросы