更改方法中的数组会更改数组外部

pur*_*lue 15 java variables scope

我的变量范围有问题.

public static void main(String[] args){
    int[] test={1,2,3};
    test(test);
    System.out.println(test[0]+" "+test[1]+" "+test[2]);
}

static void test(int[] test){
    test[0]=5;
}
Run Code Online (Sandbox Code Playgroud)

我期望输出到1 2 3,但结果是5 2 3.为什么我在方法中更改了数组中的值,但原始数组发生了变化?

Bri*_*ach 10

Java中的数组是一个对象.当您通过创建数组时new,它将在堆上创建,并返回一个引用值(类似于C中的指针)并将其分配给您的变量.

在C中,这将表示为:

int *array = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

将该变量传递给方法时,您将传递的参考值(已复制)传递给方法中的本地(堆栈)变量.不复制数组的内容,只复制参考值.再次,就像将指针传递给C中的函数一样.

因此,当您通过该引用修改方法中的数组时,您将修改堆上存在的单个数组对象.

您评论说您通过int[] temp=test...再次对数组进行了"复制" ,这只会生成指向内存中单个数组的引用值(指针)的副本.你现在有三个变量都对同一个数组保持相同的引用(一个在你main()的方法中,两个在你的方法中).

如果要复制数组的内容,Java会Arrays类中提供一个静态方法:

int[] newArray = Arrays.copyOf(test, test.length); 
Run Code Online (Sandbox Code Playgroud)

这将在堆上分配一个新的数组对象(由第二个参数指定的大小),将现有数组的内容复制到它,然后返回对该新数组的引用.