【发布时间】:2015-07-05 02:34:05
【问题描述】:
例如:
int[][] matrix = new int[3][1];
int[] vector = {1,2,3,4,5};
matrix[0] = vector;
即使vector 的长度比matrix 所代表的行长,它也能正常编译和运行。
为什么 Java 接受这个?
【问题讨论】:
标签: java matrix vector variable-length
例如:
int[][] matrix = new int[3][1];
int[] vector = {1,2,3,4,5};
matrix[0] = vector;
即使vector 的长度比matrix 所代表的行长,它也能正常编译和运行。
为什么 Java 接受这个?
【问题讨论】:
标签: java matrix vector variable-length
这个
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]
【讨论】:
new int[10] 创建了一个包含10 个int 变量的数组,所有变量都初始化为它们的默认值。
你必须明白,在 Java 中 int[][] matrix,实际上并不是数学意义上的矩阵......或者 C、C++、FORTRAN 等意义上的矩阵。
它实际上是一个数组数组。 int[][] 类型的意思是“整数数组的数组”。整数数组不需要是相同的大小。它们不需要是不同的。他们甚至可以是null。
在这种情况下,您创建了一个如下所示的数据结构:
matrix -> [ o , o , o ]
| | |
| | V
| | [ 0 ]
| V
| [ 0 ]
V
[ 0 ]
类型是int[][] ...它仅将数组的“形状”限制为二维
当您分配vector 时,您将数据结构更改为如下所示:
matrix -> [ o , o , o ]
| | |
| | V
| | [ 0 ]
| V
| [ 0 ]
V
vector ---> [ 1, 2, 3, 4, 5 ]
从 Java 类型的角度来看,这是有道理的。
为什么 Java 接受这个?
因为它是有意义的......根据数组的 Java 模型和数组类型。
如果您试图将 Java 数组等同于数学矩阵,这是没有意义的。但它们不是一回事。
如果您认为matrix[0] = ... 是在复制数组元素,那是没有意义的。但事实并非如此。它正在分配一个引用。
【讨论】: