2014-01-23 34 views
-5
public static void main(String[] args) { 
    int i[][][] = new int[3][2][1]; 
    System.out.println(i[0].length + " " + i[0][0].length); 
} 

上面的程序似乎应该打印“3 2”。相反,它会打印“2 1”。所以看起来[0]是指“第二维度”而不是第一维度。为什么?如何我指的是第一个维度?阵列长度不按预期工作

i [0] [0] [0] .length完全不起作用,但给出了“int不能被解除引用”。我在这里错过了什么?

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html –

+3

'System.out.println(i.length +“”+ i [0] .length);'.. – Reimeus

回答

2

第一个维度是i。让我们分开它:

int i[][][] = new int[3][2][1]; 
int j[][] = i[0] 
int k[] = j[0] // or i[0][0] 
int l = k[0] // or j[0][0] or i[0][0][0] 
// the following prints 3 2 1 
System.out.println(i.length + " " + i[0].length + " " + i[0][0].length); 

你在你的评论中说anArray[0]是第一个元素。这是对的。三维数组的第一个元素是一个二维数组,在你的情况下它的长度为2.

如果你用另一种方式写它(你的方法有点不合常规):

int[][][] i = new int[3][2][1]; 

这表明i指向一个三维int数组。如果你想要这个数组的长度(或者更好的说它是第一维),你必须通过i得到它。

2

i是3维数组,因此i.length给出了第一个大小。

i[0]是第一个二维数组,因此i[0].length给出了第二个大小。

i[0][0]是1维数组中的第一个,所以i[0][0].length给出了第三个大小。

i[0][0][0]是一个int,所以不能做.length就可以了。

1

这在Java中有点不自然。

直觉上,我会解释这一点:

new int[x][y][z] 

的存在:

new ((int[x])[y])[z] // (Array of int[][]) with length z 

但是,这是不是真正。这是很奇怪的部分。它实际上真的是:

new int[x]([y]([z])) // (Array of int[][]) with length x 

这意味着这是与长度x的数组。该数组包含所有大小为y的数组,并且这些数组包含所有大小为z的数组。

+0

我从来不用数组的初始值来查看数组,而是使用它们,它们是'i [0] [1] [2]'。这比'i [2] [1] [0]'更直观,因此数组就像这样初始化。哦,顺便说一句:你的文章没有回答这个问题;) – Njol

+0

我知道,这就是他们这样做的原因。但是,想想:'new int [5] [2]'和'new Object [5]'有什么区别?在第二种情况下,“对象”部分是数组的类型。在第一种情况下,数组的类型实际上是:'int [2]',这有点凌乱,对吧? –