2016-11-28 91 views
-1
boolean[][] values = new boolean[3][4]; 
System.out.println(values.length); 
values[2] = new boolean[8]; 
System.out.println(values[2].length + " " + values[0].length); 

這是一個多選題,我遇到了麻煩。答案應該是:這是什麼打印3 ln 8 4?

3 
8 4 

但我認爲一旦數組的大小創建後就無法更改。任何解釋將不勝感激。

+3

您不更改數組的長度,而是創建一個不同長度的新長度。 –

+0

你正在製作一個「鋸齒狀陣列」。 –

+2

我不認爲這個問題很糟糕。畢竟,該數組被初始化爲'boolean [3] [4]',現在不再是'boolean [3] [4]',而是「衣衫襤褸」,即'boolean [3] [whatever]'。 –

回答

2

您不更改數組的長度,您正在創建一個不同長度的新長度。

values[2] = new boolean[4]; 
assert values[2].length == 4; 

values[2] = new boolean[8]; 
assert values[2].length == 8; 

就像書寫

boolean[] values2 = new boolean[4]; 
assert values2.length == 4; 

values2 = new boolean[8]; 
assert values2.length == 8; 

注:一個boolean[]變量是一個參考到陣列。它不是數組對象,所以當您更改此參考時,您指向一個不同的對象。

2
values = new boolean[3][4] 

...創建一個長度爲3的數組,由一個名爲values的變量指向。在每一個點values三個要素的長度的陣列4.

所以:

System.out.println(values.length); 

...打印3.

values[2] = new boolean[8]; 

...創建一個長度的一個新的數組8,並使values的元素2指向它。

曾經是值的元素2的數組不再具有引用 - 它會丟失(如果JVM保持足夠長的時間,它將被垃圾回收清除)。

values[0]仍然是在開始時創建的4元素數組。 values[2]是新創建的長度爲8的數組。

2

在Java中,二維數組實際上是數組的數組,而不是像一些其他語言那樣被劃分成若干行的字節塊。

在聲明數組作爲

boolean[][] values = new boolean[3][4]; 

它基本上只是一個速記寫作:

boolean[][] values = { 
    new boolean[4], 
    new boolean[4], 
    new boolean[4] 
}; 

所以,你有一個數組,其元素是布爾值的數組。

沒有什麼能阻止你改變這個數組中的一個條目。你有第一個數組,第二個數組和第三個數組,你只是替換第三個數組。

因此,它不會更改數組的大小,因爲聲明new boolean[3][4]僅爲第一維和其中的初始值(數組)設置了固定大小。但是,如果您願意,您可以用具有不同大小的新值替換這些初始值 - 只要您不嘗試更改主陣列的大小即可。