在Java中,将一个数组分配给另一个数组存在问题

21
public class TestingArray {

    public static void main(String[] args) {

        int iCheck = 10;
        int j = iCheck;
        j = 11;
        System.err.println("value of iCheck "+iCheck);

        int[] val1 = {1,2,9,4,5,6,7};
        int[] val2 = val1;
        val2[0] = 200;
        System.err.println("Array Value "+val1[0]);
    }
}

输出:

iCheck的值为10
数组值为200

从上面的代码中,我发现如果将任何数组 val2 分配给另一个数组 val1 ,并且如果我们更改 val2 数组的任何值,则结果也会反映在 val1 数组中,而变量赋值时不是这种情况。 为什么呢?

4个回答

39
以下语句使得val2引用与val1相同的数组:
int[] val2 = val1;

如果你想要制作一个副本,你可以使用 val1.clone() 或者 Arrays.copyOf()

int[] val2 = Arrays.copyOf(val1, val1.length);

对象(包括集合类的实例、StringInteger等)以类似的方式工作,赋值一个变量给另一个变量只是复制引用,使得两个变量都指向同一个对象。如果该对象是可变的,则通过其中一个变量对其内容所做的后续修改也将通过另一个变量可见。

基本类型(intdouble等)的行为不同:没有涉及引用,赋值会复制值。


4

简单来说,"val1"和"val2"是指向实际数组的指针。你将val2赋值为指向与val1相同的数组。因此,改变其中一个,另一个也会看到相同的变化。要真正复制它,您必须克隆数组而不是赋值。


4
因为在Java中,数组是对象,并且是按引用传递的。

1
因为你将val1的引用赋值给了val2,所以它们都指向内存中的同一个对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接