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
其中 0x0001
、0x0123
、0x0456
和 0x0789
是引用值的示例(将其视为对象的地址)。
这个
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] = ...
是复制数组元素,那是没有意义的。但事实并非如此。它正在分配一个参考。
例如:
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
其中 0x0001
、0x0123
、0x0456
和 0x0789
是引用值的示例(将其视为对象的地址)。
这个
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] = ...
是复制数组元素,那是没有意义的。但事实并非如此。它正在分配一个参考。