在运行时更改2D数组的列大小

时间:2018-04-11 11:03:36

标签: java arrays matrix

在下面的代码中,我定义了一个(2x2)2D数组,arr。然后我声明一个包含5个元素的一维字符串数组a,并将其分配给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。

3 个答案:

答案 0 :(得分:1)

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:正确的数组数组 管理,提供多维效果。

答案 1 :(得分:1)

实际发生的是嵌套数组(与C / C ++中相同):

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

首先,您访问array [],然后访问另一个数组(嵌套的数组)。 如果您想要原始效果,请避免这样做,请使用特殊的math matrix lib。 此外,如果矩阵中有很多空单元格,请考虑使用地图。 对于花哨的ascii东西,我使用this

答案 2 :(得分:0)

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数组重新分配给另一个5-elemen one。 2元素数组不再被引用,偶尔也会被GC引用。

要将元素从a复制到arr,请使用:

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

将抛出异常。