Java Arraylist通过引用或值来工作?

时间:2013-12-13 06:49:52

标签: java arraylist pass-by-reference

我在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

2 个答案:

答案 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不是数组本身,它只是对数组的引用。