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

Java: Why does matrixes accept lines greater than the predefined length?

例如:

int[][] matrix = new int[3][1];
int[] vector = {1,2,3,4,5};
matrix[0] = vector;

它可以正常编译和运行,即使 vector 的长度比 matrix 的一行要长。

为什么 Java 接受这个?

这个

int[][] matrix = new int[3][1];

定义了一个包含 int 个数组的数组。具体来说,它定义了一个大小为 3 的数组。然后使用对大小为 1 的新数组的引用来初始化这三个元素中的每一个,其中该元素使用值 0 进行初始化。

当你这样做时

matrix[0] = vector;

您正在将存储在 vector 中的引用值的副本(引用具有 5 个元素的 int[])分配给 matrix 中索引 0 处的元素。

因为画画很有趣:

int[][] matrix = new int[3][1];

可以说明为

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

其中 0x00010x01230x04560x0789 是引用值的示例(将其视为对象的地址)。

这个

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

添加一个新的 int[]

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

vector = 0x9999

matrix[0] = vector; 

成功

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

你要明白,在Java int[][] matrix中,实际上并不是数学意义上的矩阵...或者C、C++、FORTRAN等等意义上的矩阵。

其实就是一个数组的数组。类型 int[][] 表示 "array of arrays of integers"。整数数组不需要大小相同。它们不需要是不同的。他们甚至可以是 null.

在本例中,您创建的数据结构如下所示:

matrix -> [ o , o , o ]
            |   |   |
            |   |   V
            |   |   [ 0 ]
            |   V
            |   [ 0 ]
            V
            [ 0 ]

类型为int[][] ...这仅将数组的"shape"约束为二维

当您分配 vector 时,您将数据结构更改为如下所示:

matrix -> [ o , o , o ]
            |   |   |
            |   |   V
            |   |   [ 0 ]
            |   V
            |   [ 0 ]
            V
vector ---> [ 1, 2, 3, 4, 5 ]

从 Java 打字的角度来看,这是有道理的。


Why does Java accept this?

因为它有意义...根据数组的 Java 模型和数组类型。

  • 如果您试图将 Java 数组等同于数学矩阵,那是没有意义的。但它们不是一回事。

  • 如果你认为matrix[0] = ...是复制数组元素,那是没有意义的。但事实并非如此。它正在分配一个参考。