Java 在运行时更改二维数组的列大小
在下面的代码中,我定义了一个(2x2)2D数组,Java 在运行时更改二维数组的列大小,java,arrays,matrix,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; Syste
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。Java中没有多维数组
String[][]
描述一维数组的一维数组。每个子数组不必具有相同的长度
新字符串[2][2]只是语法上的糖
String[][] arr = new String[2][]
arr[0] = new String[2];
arr[1] = new String[2];
arr[0]=a
将引用从两元素字符串数组重新分配到另一个5元素字符串数组。2元素数组不再被引用,偶尔也会被GC'ed引用
要将元素从a
复制到arr
中,请使用:
System.arraycopy(a, 0, arr[0], 0, a.length);
将抛出异常。
< P> java考虑:<代码> ARR [ 0 ] = A;作为使用a
初始化的数组
这是一个非对称多维数组。看这张照片
创建非对称数组的另一种方法是只初始化数组的第一个维度,
并在单独的语句中定义每个数组组件的大小:
int [][] args = new int[4][];
args[0] = new int[5];
args[1] = new int[3];
这项技术揭示了Java真正得到的东西:数组的数组
托管,提供多维效果。实际发生的是嵌套数组(与C/C++中相同):
因此,首先访问数组[],然后访问另一个数组(嵌套数组)。
如果希望获得原始性能,请避免这样做,请使用特殊的。
另外,如果矩阵中有很多空单元,请考虑使用映射代替。
对于我使用的ascii格式的东西。@TimBiegeleisen在赋值后,行长度变为5。哇,我不知道这一点arr[0]
是对1D数组的引用,您可以根据需要进行任何分配。在Java中,2D(或3D等)数组可以是锯齿状的,这意味着第二个维度不一定都是相同的。作为参考,您根本不必定义第二个维度的长度<代码>字符串[][]arr=新字符串[1][]
已经有效,但如果删除第一个维度的大小或只是初始化第二个维度的大小,则会引发错误dimension@XtremeBaumer所以,第二维度似乎不重要。你用这个做什么?
array[][] (actually just array[])
+---+ +---+ +---+ +---+ +---+
| | | | | | | | | | .
| 0 | | 1 | | 2 | | 3 | | 4 | .
| | | | | | | | | | .
+-+-+ +-+-+ +---+ +---+ +---+
| |
v v
arr[] arr[]
+---+ +---+
| | | |
| 0 | | 0 |
| | | |
+---+ +---+
| | | |
| 1 | | 1 |
| | | |
+---+ +---+
| | | |
| 2 | | 2 |
| | | |
+---+ +---+
... ...