我在Java中运行以下程序:
public class foobar {
public static void main(String[] args) {
ArrayList<float[]> arr = new ArrayList<float[]>(10);
for (int i=0; i<10; i++){
int k = i + 10;
float[] foo = new float[5];
foo[2] = k;
//System.out.println(Arrays.toString(foo));
arr.add(foo);
foo[0] = 11;
foo = null;
}
for (float[] item:arr) {
System.out.println(Arrays.toString(item));
}
}
}
并输出,
[11.0, 0.0, 10.0, 0.0, 0.0]
[11.0, 0.0, 11.0, 0.0, 0.0]
[11.0, 0.0, 12.0, 0.0, 0.0]
[11.0, 0.0, 13.0, 0.0, 0.0]
[11.0, 0.0, 14.0, 0.0, 0.0]
[11.0, 0.0, 15.0, 0.0, 0.0]
[11.0, 0.0, 16.0, 0.0, 0.0]
[11.0, 0.0, 17.0, 0.0, 0.0]
[11.0, 0.0, 18.0, 0.0, 0.0]
[11.0, 0.0, 19.0, 0.0, 0.0]
据我所知,Arraylist只存储对象的引用(在这种情况下是一个float数组)。但是,由于在这种情况下,数组foo仅在for循环的范围内有效,为什么arr在for循环之后不会以空值结束?为什么更改foo[0]=11
会反映出来,而不是foo=null
?
答案 0 :(得分:2)
在java中,所有内容都按值传递。将计算基元或引用类型,并传递其值\引用值。
当您执行float[] foo = new float[5]
时,您会创建一个reference variable foo
,其中包含指向new float[5] object
的链接。当你执行foo=null
时,你使foo引用变量包含一个空引用,但它不会影响你用new float创建的对象[5],你只需要删除引用foo var
为什么arr在for循环后不会以空值结束?
您for loop
中的原因是您将这些数组添加到ArrayList<float[]> arr
中,因此它包含所有插入的数组作为其元素。
答案 1 :(得分:0)
出于同样的原因:
int foo = 11;
int bar = foo;
foo = 12;
bar
仍然是11。
第二行说&#34;指定为值 foo 现在&#34;。 <{1}}之后获得另一个值时无关紧要。
出于同样的原因,在你的程序中,你向arraylist添加值foo
在那一点上,即对某个数组的引用。相同引用的所有副本都引用相同的对象(此处为:数组)。因此,我们现在有2个对同一个数组的引用,我们可以通过引用更改该数组。
最后,将foo
设置为null。这会覆盖变量foo,因此现在只有一个对我们更改的数组的引用。
你感到困惑:foo
不是数组本身,它只是对数组的引用。