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.
您的示例 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)