【问题标题】:Java: Why does matrixes accept lines greater than the predefined length?Java:为什么矩阵接受大于预定义长度的行?
【发布时间】: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


    【解决方案1】:

    这个

    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]
    

    【讨论】:

    • 该元素在哪里初始化为值 0.. 但是局部变量不会被分配默认值.. 数组有什么不同吗??
    • @Codebender 这个符号new int[10] 创建了一个包含10 个int 变量的数组,所有变量都初始化为它们的默认值。
    【解决方案2】:

    你必须明白,在 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] = ... 是在复制数组元素,那是没有意义的。但事实并非如此。它正在分配一个引用。

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多