Java:为什么矩阵接受大于预定义长度的行?

Mr *_*rte 2 java vector matrix variable-length

例如:

int[][] matrix = new int[3][1];
int[] vector = {1,2,3,4,5};
matrix[0] = vector;
Run Code Online (Sandbox Code Playgroud)

它编译并正常运行,即使vector它的长度大于一条线的长度matrix.

为什么Java接受这个?

Sot*_*lis 7

这个

int[][] matrix = new int[3][1];
Run Code Online (Sandbox Code Playgroud)

定义数组int数组.具体来说,它定义了一个大小的数组3.然后,通过引用大小为1的新数组来初始化这三个元素中的每一个,其中该元素用值0初始化.

当你这样做的时候

matrix[0] = vector;
Run Code Online (Sandbox Code Playgroud)

您正在为索引0中的元素分配存储的参考值的副本vector(其中引用了int[]5个元素)matrix.

因为图纸很有趣:

int[][] matrix = new int[3][1];
Run Code Online (Sandbox Code Playgroud)

可以说明为

0x0001 -> int[][] of size 3, elements = [0x0123, 0x0456, 0x0789]

[address]
0x0123 -> int[] of size 1, elements = [0]
0x0456 -> int[] of size 1, elements = [0]
0x0789 -> int[] of size 1, elements = [0]

matrix = 0x0001
Run Code Online (Sandbox Code Playgroud)

其中0x0001,0x0123,0x0456,和0x0789是的基准值的例子(认为它作为一个地址到一个对象).

这个

int[] vector = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

添加一个新的 int[]

0x9999 -> int[] of size 7, elements = [1,2,3,4,5]

vector = 0x9999
Run Code Online (Sandbox Code Playgroud)

matrix[0] = vector; 
Run Code Online (Sandbox Code Playgroud)

做到了

0x0001 -> int[][] of size 3, elements = [0x9999, 0x0456, 0x0789]
Run Code Online (Sandbox Code Playgroud)