2016-11-28 95 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]仅为第一维和其中的初始值(数组)设置了固定大小。但是,如果您愿意,您可以用具有不同大小的新值替换这些初始值 - 只要您不尝试更改主阵列的大小即可。