二维数组初始化器,后跟方括号


68

我在理解这段代码时遇到问题:

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

为什么它是可编译的,我怎么能理解这样的声明?


17
题外话,但令我惊讶的是,这个问题如此受欢迎。如今,大多数问题似乎都少于四个句子,并且/或者是关于询问“这是怎么做的”而被贬低为遗忘= P。
theGreenCabbage 2013年

6
@theGreenCabbage法律上足够有趣的问题
理查德·

2
@theGreenCabbage给程序员一个合适的难题,他们会流口水。;)(顺便说一句,现在所有SE网站上都出现了这个问题)
Shadow Wizard正在

25
我真的希望您能在“ Java技巧”一书中找到它,而不是有人写的一些实际生产代码。
Shivan Dragon 2013年

3
这可能是具体情况的简化示例。例如,他可能会像这样创建一个2x2字段并获得第一行:int[] it = new int[][]{{1, 2}, {3, 4}}[0];这不是很常见,但是它也不是最不可读的代码。
Jeroen Vannevel 2013年

Answers:


103

您在这里所做的是:

  1. 声明一个新变量int[] it(是一维数组)
  2. 从第一个元素分配其值 [0]
  3. 二维数组 new int[][]
  4. 初始化为 {{1}}

因此,您创建了一个二维数组,将其初始化为包含一个包含的数组,1同时您将外部数组的第一个元素(包含的一维数组1)作为元素,并将其分配给变量。


凉。今天学到了新东西。因此从技术上讲,不需要此多维数组吗?的{{1}}是简单地将单个1成多维的。这样的声明有什么用?
theGreenCabbage 2013年

在这种情况下,我没有看到任何有效的目的。但是,如果您需要为某些旧版库提供这种格式的参数,则可能会很有用。
亚当·阿罗德

1
很好的解释,“尽可能简单,必要时尽可能复杂” :)
acostache 2013年

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

让我们将其分解为每个阶段以及它的含义。

new int[][] 

这是一个新的多维数组。

{{1}} 

这是一个多维数组文字。它使数组看起来像这样:

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

因此请注意,此数组内的每个元素本身就是一个数组。然后,您指定了变量it等于多维数组中的第一个数组,因此它直接等于:

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

4
在发布时,我还没有真正看到任何其他答案能够破坏这样的说法。
克里斯托弗

我喜欢这些类型的解释。当我试图解释某些会分解结构正确的单个元素的内容时,我肯定会模仿这种类型的答案。有时我会在分解的同时学习一些东西!当我尝试调试自己的代码时,也会使用它。
theGreenCabbage 2013年

很好的解决方法,但是您键入了初始化器:{{1}},而不是{{0}}。
Justsalt

我发现“ {{1}}[…]组成的数组看起来像这样:[…][10] = [] ”具有误导性:没有这样的事情,[10]因为外部数组的大小仅为1,因此唯一的元素位于索引0(并且包含如您正确所述,另一个大小为1的数组,其中包含整数1。虽然我已经开始挑剔,但我认为您错过了最后一行的更新(应该是{1},不是{0})。最后一点,只是为了好玩:您甚至可以将行缩短为just int[] it = {1};(这仅在声明数组变量时有效,在所有其他情况下都需要new int[]{…})。
siegi 2013年

我感谢您抽出宝贵的时间阅读我的回答,但只有{1}批评是有效的。随着0-10我是想说明的一点是它的其余部分是空的..我做到了。干杯。
克里斯托弗

9

new int[][]{{1}}分配新的1x1 2D阵列。(仅)元素设置为1。

[0]返回到第一个(并且只有)行,这是类型的引用int[]

int[] it = ...声明一个变量,并与上述参考文献对其进行初始化。

最终结果等于int[] it = new int[]{1}


1
@kai:结果是一维数组,但是您正在使用二维数组。
Jeroen Vannevel 2013年

6

本质上,您将创建一个匿名二维数组(new int[][]{{1}}),然后获取该二维数组()的第一个元素,{1}并将其分配给变量it

让我们一步一步走,因为这实际上有点令人困惑。

new int[][]{{1}}:这将创建一个只有一个元素的二维数组:一个数组,其中包含一个数组,其中一个数组包含一个int(数字1)。由于未在任何地方将其分配给变量,并且无法通过此语句访问,因此我们将其称为“匿名”,并且其范围可能最小。

[0]:这将访问我们在上面创建的匿名二维数组的第一个元素。第一个元素是包含1(即)的维数组{1}

int[] it =:最后,在这里,我们将获取的一维数组存储在变量中。

附带说明一下,绝对没有理由这样做,这似乎只是一个非常有趣的Java难题。


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];

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.