二维数组初始化程序后跟方括号

68

我对这段代码不太理解:

int[] it = new int[][]{{1}}[0];
为什么它可以编译,我该如何理解这样的声明?

17
离题了,但我很惊讶这个问题得到了这么好的反响。现在似乎大多数少于四句话或询问“这是做什么的”的问题都会被投票至无人问津 =P。 - theGreenCabbage
6
足够有趣的问题是不受法律约束的。 - Richard Tingle
2
@theGreenCabbage 给程序员一个合适的难题,他们会垂涎三尺。 ;) (顺便说一句,这个问题现在已经被所有 SE 网站推荐了) - Shadow The Spring Wizard
25
我真的希望你是在某本“Java技巧”之类的书中找到了这个,而不是某个人写的实际生产代码。 - Shivan Dragon
3
这可能是一个具体情况的简化示例。例如,他可以创建一个2x2的区域,如下所示,并获得第一行:int[] it = new int[][]{{1, 2}, {3, 4}}[0]; 这不是很常见,但也不是最难懂的代码。 - Jeroen Vannevel
显示剩余12条评论
6个回答

103
你在这里做的事情是:
  1. 声明一个新的变量 int[] it (它是一个一维数组)
  2. 将它的值赋值为二维数组 new int[][] 的第一个元素 [0]
  3. 该二维数组初始化为 {{1}}
因此,你创建了一个二维数组,其包含一个包含 1 的数组,并同时取出外部数组(一个包含 1 的一维数组)的第一个元素并将其赋值给你的变量。

好的,今天学到了新东西。那么从技术上讲,这个多维数组是没有必要的吗?{{1}} 只是将单个 1 放入了一个多维数组中。这样的声明有什么用处或者可能会起到什么作用呢? - theGreenCabbage
在这种情况下,我没有看到任何有效的目的。但是,如果您需要以这种格式为某些遗留库提供参数,则它可能会很有用。 - Adam Arold
1
非常好的解释,“尽可能简单,必要时尽可能复杂” :) - acostache

30
int[] it = new int[][]{{1}}[0];

让我们将其分解为每个阶段,并了解其含义。

new int[][] 

这是一个新的多维数组。

{{1}} 

这是一个多维数组字面值。它创建一个看起来像这样的数组:

[0] = [1]
[1] = []
[2] = []
...
[N] = []

注意,这个数组内的每个元素都是一个数组。然后你指定你的变量 it 等于多维数组中的第一个数组,所以它直接等同于:

int[] it = new int[] {1};

4
发布时,我没有看到其他对该声明进行类似细致分析的答案。 - christopher
我喜欢这种类型的解释。当我试图解释一些逐个分解的结构良好的元素时,我肯定会模仿这种回答风格。有时候我在分解的过程中也会学到一些东西!当我尝试调试自己的代码时,我也会利用它。 - theGreenCabbage
很好的分解,但您输错了初始化器:{{1}},不是{{0}}。 - Justsalt
我认为 "{{1}} […] 使数组看起来像这样:[…] [10] = []" 这部分是误导性的:因为外部数组只有大小为1,所以没有 [10] 这样的东西,所以唯一的元素在索引0处(并包含另一个大小为1的整数1的数组,正如您正确陈述的那样)。虽然我已经在吹毛求疵了,但我认为您忘记更新最后一行了(应该是 {1},而不是 {0})。最后一个注意事项,只是为了好玩:你甚至可以将这一行缩短到 int[] it = {1};(这仅适用于声明数组变量,在所有其他情况下,您都需要使用 new int[]{…})。 - siegi
虽然我感谢你抽出时间阅读我的回答,但只有{1}的批评是有效的。我使用0-10试图说明其余部分为空...我已经做到了。干杯。 - christopher

9
new int[][]{{1}} 分配了一个新的 1x1 的二维数组,其中(唯一的)元素被设置为 1。 [0] 返回对第一行(也是唯一的行)的引用,其类型为 int[]int[] it = ... 声明一个变量并使用上述引用进行初始化。
最终结果等同于 int[] it = new int[]{1}

1
@kai:结果是一个一维数组,但你正在使用一个二维数组。 - Jeroen Vannevel

6

我会尝试将其分解

new int[][] // an array of arrays (or 2-dimensional array)
{1} // an array instance with a single element: 1
{{1}} // an array instance with a single element: above array instance
[0] // the first element of an array

因此,它大致相当于以下代码:

int[] inner = new int[1]; // an empty array with length 1
inner[0] = 1;
int[][] outer = new int[1][];
outer[0] = inner;

int[] it = outer[0];

6
基本上,您正在创建一个匿名的二维数组(new int [] [] {{1}} ),然后将该二维数组的第一个元素({1} )赋值给变量 it
让我们一步一步来,因为这实际上有点令人困惑。 new int [] [] {{1}} :这将创建一个仅具有一个元素的二维数组:一个包含一个数组的数组,该数组包含一个 int (数字1)。由于它在任何地方都没有被分配给变量,并且在此语句之后将无法访问,因此我们称其为“匿名”,并且它具有最小的范围。 [0] :这将访问我们上面创建的匿名二维数组的第一个元素。第一个元素是一个包含1的单维数组(即 {1} )。 int [] it = :最后,在这里,我们将获取的单维数组存储在我们的变量中。
顺便说一句,完全没有理由这样做,似乎只是一个非常有趣的Java难题。

5
int[] it = new int[][]{{1}}[0];

整型数组 it 被赋值为以下内容:
new int[][] // A new 2D array is created
{{1}} // This is an initializer. The first array in the first array gets an array of 1 item: '1'
[0] // Take the first array from the 2D array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接