2014-01-23 71 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]',這有點凌亂,對吧? –