修改作为method-parameter传递的数组

Eng*_*uad 6 java arrays clone pass-by-value

假设我有一个int数组,我想修改它.我知道我不能将新数组分配给作为参数传递的数组:

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 1
}
public static void method(int[] n)
{
    n = new int[]{2};
}
Run Code Online (Sandbox Code Playgroud)

虽然我可以修改它:

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 2
}
public static void method(int[] n)
{
    n[0] = 2;
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试将一个任意数组赋值给作为参数传递的数组clone():

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]); // prints 1 ?!
}
public static void method(int[] n)
{
    int[] temp = new int[]{2};
    n = temp.clone();
}
Run Code Online (Sandbox Code Playgroud)

现在,我想知道为什么它在最后一个例子中打印1,而我只是复制clone()它只是复制值而不是引用的数组.你能帮我解释一下吗?


编辑:有没有办法将数组复制到对象而不更改引用?我的意思是做最后一个例子打印2.

Zen*_*ter 4

您的示例 1 和 3 在问题上下文中实际上是相同的 - 您正在尝试分配一个新值n(这是对按值传递的数组的引用)。

您克隆数组的事实temp并不重要 - 它所做的只是创建 的副本temp,然后将其分配给n.

为了将值复制到传递给方法的数组中,method您可能需要查看:System.arraycopy

当然,这一切都取决于n数组的大小以及您在method方法内创建的数组的大小。

例如,假设它们的长度相同,您可以这样做:

public static void main(String[] args)
{
    int[] temp_array = {1};
    method(temp_array);
    System.out.println(temp_array[0]);
}
public static void method(int[] n)
{
    int[] temp = new int[]{2};
    System.arraycopy(temp, 0, n, 0, n.length); 
    // or System.arraycopy(temp, 0, n, 0, temp.length) - 
    // since we assumed that n and temp are of the same length
}
Run Code Online (Sandbox Code Playgroud)