为什么打印3 ln 8 4?

时间:2016-11-28 17:16:13

标签: java arrays

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

但我认为数组的大小一旦创建就无法更改。任何解释都将非常感激。

3 个答案:

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

答案 1 :(得分: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 :(得分:2)

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

将数组声明为

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

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

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

所以你有一个数组,其元素是布尔数组。

没有什么可以阻止您更改此阵列中的一个条目。你有第一个数组,第二个数组和第三个数组,你只需要替换第三个数组。

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