java - 修改作为方法参数传递的数组

标签 java arrays clone pass-by-value

假设我有一个整数数组,我想修改它。我知道我无法将新数组分配给作为参数传递的数组:

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};
}

虽然我可以修改它:

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;
}

然后,我尝试使用 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();
}

现在,我想知道为什么它在上一个示例中打印 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
}

关于java - 修改作为方法参数传递的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129369/

相关文章:

java - 为什么 Random 中的 next 方法使用 compareAndSet?

c - 数组允许在 C 中越界访问?

javascript - Angular js在数据出现在表格上之前从数据中删除逗号,],“

Javascript 将数字 0 视为空白字符串?

javascript - 将原始数组与深度克隆进行比较,不起作用

java - 如何在表格标题中添加页码?

java - JBoss AS 5.1 上的 EJB3 注入(inject)失败错误 : ClassLoaders of value and target are not equal

java - 该抽象类的接口(interface)等效项

javascript - 如何克隆多维数组?

jquery - 将选择列表转换为 ul 列表