我在理解这段代码时遇到问题:
int[] it = new int[][]{{1}}[0];
为什么它是可编译的,我怎么能理解这样的声明?
我在理解这段代码时遇到问题:
int[] it = new int[][]{{1}}[0];
为什么它是可编译的,我怎么能理解这样的声明?
int[] it = new int[][]{{1, 2}, {3, 4}}[0];
这不是很常见,但是它也不是最不可读的代码。
Answers:
您在这里所做的是:
int[] it
(是一维数组)[0]
new int[][]
{{1}}
因此,您创建了一个二维数组,将其初始化为包含一个包含的数组,1
同时您将外部数组的第一个元素(包含的一维数组1
)作为元素,并将其分配给变量。
{{1}}
是简单地将单个1
成多维的。这样的声明有什么用?
int[] it = new int[][]{{1}}[0];
让我们将其分解为每个阶段以及它的含义。
new int[][]
这是一个新的多维数组。
{{1}}
这是一个多维数组文字。它使数组看起来像这样:
[0] = [1]
[1] = []
[2] = []
...
[N] = []
因此请注意,此数组内的每个元素本身就是一个数组。然后,您指定了变量it
等于多维数组中的第一个数组,因此它直接等于:
int[] it = new int[] {1};
{{1}}
[…]组成的数组看起来像这样:[…][10] = []
”具有误导性:没有这样的事情,[10]
因为外部数组的大小仅为1,因此唯一的元素位于索引0(并且包含如您正确所述,另一个大小为1的数组,其中包含整数1。虽然我已经开始挑剔,但我认为您错过了最后一行的更新(应该是{1}
,不是{0}
)。最后一点,只是为了好玩:您甚至可以将行缩短为just int[] it = {1};
(这仅在声明数组变量时有效,在所有其他情况下都需要new int[]{…}
)。
{1}
批评是有效的。随着0-10
我是想说明的一点是它的其余部分是空的..我做到了。干杯。
在new int[][]{{1}}
分配新的1x1 2D阵列。(仅)元素设置为1。
将[0]
返回到第一个(并且只有)行,这是类型的引用int[]
。
该int[] it = ...
声明一个变量,并与上述参考文献对其进行初始化。
最终结果等于int[] it = new int[]{1}
。
本质上,您将创建一个匿名二维数组(new int[][]{{1}}
),然后获取该二维数组()的第一个元素,{1}
并将其分配给变量it
。
让我们一步一步走,因为这实际上有点令人困惑。
new int[][]{{1}}
:这将创建一个只有一个元素的二维数组:一个数组,其中包含一个数组,其中一个数组包含一个int
(数字1)。由于未在任何地方将其分配给变量,并且无法通过此语句访问,因此我们将其称为“匿名”,并且其范围可能最小。
[0]
:这将访问我们在上面创建的匿名二维数组的第一个元素。第一个元素是包含1(即)的一维数组{1}
。
int[] it =
:最后,在这里,我们将获取的一维数组存储在变量中。
附带说明一下,绝对没有理由这样做,这似乎只是一个非常有趣的Java难题。
我会尽力分解
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];