繁体   English   中英

为什么打印3 ln 8 4?

[英]Why does this print 3 ln 8 4?

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
8 4

但是我认为一旦创建数组就无法更改大小。 任何解释将不胜感激。

您没有更改数组的长度,而是创建了另一个不同长度的数组。

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[]变量是对数组的引用 它不是数组对象,因此当您更改此引用时,您将指向另一个对象。

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的数组。

在Java中,二维数组实际上是数组的数组,而不是象某些其他语言那样分成行的字节块。

当您将数组声明为

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

这基本上只是编写的简写:

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

因此,您有一个数组,其元素是布尔数组。

没有什么可以阻止您更改此数组中的一项。 您有第一个数组,第二个数组和第三个数组,而您只是要替换第三个。

因此,它不会更改数组的大小,因为声明new boolean[3][4]仅为第一维及其初始值(数组)设置固定大小。 但是,您可以根据需要用具有不同大小的新值替换这些初始值-只要您不尝试更改主数组的大小即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM