Изменение размера столбца 2d-массива во время выполнения

В приведенном ниже коде я определил 2D-массив (2x2), arr. Затем я объявляю одномерный массив String a с 5 элементами и назначаю его первой строке 2D-массива. Почему мне разрешено это делать и почему он не выводит индекс массива из связанного исключения?

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

String a[] = { "1", "2", "3", "4", "5" };

String[][] arr= new String[2][2];

int x;

arr[0] = a;
x = arr[0].length;
System.out.print("The row length is "+ x);

Выход: длина строки равна 5.

@TimBiegeleisen После присвоения длина строки изменится на 5.

hermit 11.04.2018 13:07

Вау, вроде как я этого не знала. arr[0] - это ссылка на одномерный массив, и вы можете сделать любое присвоение, какое захотите. В Java массив 2D (или 3D и т. Д.) Может быть зазубренный, что означает, что не все вторые измерения должны быть одинаковыми.

Tim Biegeleisen 11.04.2018 13:09

Для справки, вам вообще не нужно определять длину 2-го измерения. String[][] arr = new String[1][]; уже действителен, тогда как он выдает ошибку, если вы либо удалите размер для первого измерения, либо просто инициализируете размер второго измерения.

XtremeBaumer 11.04.2018 13:12

@XtremeBaumer, кажется, второе измерение не имеет значения ..

hermit 11.04.2018 13:13

Для чего вы это используете?

Christophe Roussy 11.04.2018 13:26

Для производительности рассмотрим другие подходы: stackoverflow.com/questions/529457/…

Christophe Roussy 11.04.2018 13:35
1
6
1 114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В Java нет многомерных массивов.

String[][] описывает одномерный массив одномерных массивов. Необязательно, чтобы каждый подмассив имел одинаковую длину.

new String [2] [2] - это просто синтаксический сахар для

String[][] arr = new String[2][]
arr[0] = new String[2];
arr[1] = new String[2];

arr[0] = a переназначает ссылку из двухэлементного массива String на другой пятиэлементный. На массив из 2 элементов больше не ссылаются, а иногда и на сборщик мусора.

Чтобы скопировать элементы из a в arr, используйте:

System.arraycopy(a, 0, arr[0], 0, a.length);

Что вызовет исключение.

Java рассматривает этот arr[0] = a; как массив, который инициализируется с помощью a.

это асимметричный многомерный массив. посмотри на эту картинку.

enter image description here

Другой способ создать асимметричный массив - инициализировать только первое измерение массива, и определите размер каждого компонента массива в отдельном операторе:

int [][] args = new int[4][];
args[0] = new int[5];
args[1] = new int[3];

Этот метод показывает, что вы действительно получаете с Java: массивы массивов, которые правильно управляемые, предлагают многомерный эффект.

На самом деле происходит вложенные массивы (такие же, как в C / C++):

array[][] (actually just array[])
+---+ +---+ +---+ +---+ +---+
|   | |   | |   | |   | |   | .
| 0 | | 1 | | 2 | | 3 | | 4 | .
|   | |   | |   | |   | |   | .
+-+-+ +-+-+ +---+ +---+ +---+
  |     |
  v     v
arr[] arr[]
+---+ +---+
|   | |   |
| 0 | | 0 |
|   | |   |
+---+ +---+
|   | |   |
| 1 | | 1 |
|   | |   |
+---+ +---+
|   | |   |
| 2 | | 2 |
|   | |   |
+---+ +---+
 ...   ...

Итак, сначала вы обращаетесь к array [], а затем к другому массиву (вложенному). Если вы хотите сырая производительность, избегайте этого, используйте специальный математическая матрица lib. Также, если у вас много пустых ячеек в матрице, рассмотрите возможность использования вместо этого Maps. А для причудливых ascii-файлов я использую это.

Другие вопросы по теме