【问题标题】:One-dimensional array references to multi-dimensional array一维数组引用多维数组
【发布时间】:2014-01-13 01:27:24
【问题描述】:

为什么这段代码会编译?

int[] array = new int[][]{{1}}[0];

左边是一维数组。右边我以为是三维的,但不是吗?

【问题讨论】:

    标签: java arrays multidimensional-array


    【解决方案1】:

    右边是一个一维数组,是二维数组的第一个(0th)元素

    new int[][]{{1}}
    

    为了更清楚地显示它,让我们添加括号

    int[] array = (new int[][]{{1}}) [0];// [0] is returning first row of 2D array
                              // which is 1D array so it can be assigned to `array` 
    

    【讨论】:

    • int[][]{{1}} - 我看到两个方括号,所以我想是二维数组。为什么会这样?你能解释更多吗?
    • 现在我明白了。对于那些仍然没有看到它的人:int array = new int[]{1, 2, 4} [0];。首先,数组是用三个元素创建的,我从中选择第一个元素。它只是 int。
    • @Pawel - 很高兴你知道了。当你的第二条评论弹出时,我正开始写解释。这也是一件好事——我做得不好。 :)
    • @Pshemo - 编辑非常有意义,尽管我不确定 OP 的盲点到底是什么。要意识到的关键是new int[][]{{1}}(有或没有括号)是一个array creation expression,后面的[0]只是选择刚刚创建的数组的索引0处的元素。
    【解决方案2】:

    右边的表达式做了两件事。

    //   instantiate new 2D array
    //            ┌──────┸───────┑  ┌ access zeroth element of new 2D array
    //            │              │  │
    int[] array = new int[][]{{1}} [0];
    

    这基本上等同于以下内容:

    int[][] array2D = new int[1][1];
    array2D[0][0] = 1;
    
    int[] array = array2D[0];
    

    【讨论】:

      【解决方案3】:

      从内存管理的角度来看,二维数组与一维数组相同(意味着数据存储在一维中)。因此,二维数组的第一个元素与一维数组的第一个元素相同。

      【讨论】:

      • 我知道多维数组是内存中的数组数组。但是int[][] array = new int[5][10] 会通过,int[] = new int[3][2] 不会。尺寸必须匹配,但在我的示例中,我认为不匹配。
      • 我认为大小不必匹配,因为二维数组的每个元素只是一种整数。所以,我相信 int[] array = new int[3][2] 也会起作用。
      • 但事实并非如此。在编译器中尝试:p。消息:不兼容的类型。
      • 您不必相信,如果您可以检查它。顺便说一句,int[] arrayX = new int[3][2]; 将无法编译,因为您正试图将二维整数数组传递给一维数组。
      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2020-03-25
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多