当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]
Posted
技术标签:
【中文标题】当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]【英文标题】:How does the values of an array changes when we passed it as an argument to other function? [duplicate] 【发布时间】:2016-01-13 09:39:55 【问题描述】:当我将一个数组作为参数传递给函数时,原来的数组被改变了,但数组不应该被改变,对吧?如有错误请指正。
下面我将一个 int x=10 作为参数传递给 change(int a) 函数。 原来的 int x 的值被改变了。
那么相同的代码如何以不同的方式影响数组和 int 呢?
public class Runy
public static void main(String [] args)
Runy p = new Runy();
p.start();
void start()
long [] a1 = 3,4,5;
long [] a2 = fix(a1);
int x=10;
int y= change(x);
System.out.println(y);
System.out.println(x);
System.out.print(a1[0] + a1[1] + a1[2] + " ");
System.out.println(a2[0] + a2[1] + a2[2]);
long [] fix(long [] a3)
a3[1] = 7;
return a3;
int change(int a)
a=a+1;
return a;
【问题讨论】:
数组和整数是不同的。 【参考方案1】:你错了。您传入的不是数组 - 它是数组的 reference。数组是 Java 中的引用类型,因此 a1
(例如)的值不是数组对象 - 它是对数组对象的引用。
当您将该引用传递给 fix
时,参数 (a3
) 具有与 a1
相同的值...该值引用同一个数组,因此在该方法之后对该数组的修改可见返回。此时,a1
和 a2
将是相等的引用——它们都引用同一个数组。
【讨论】:
下面我将一个 int x=10 作为参数传递给 change(int a) 函数。原始 int x 的值发生了变化。那么相同的代码如何以不同的方式影响数组和 int 呢? @prabhakarReddyG:因为int
是值类型,而数组是引用类型。对于int x = 10;
,x
的值只是整数 10...它不是参考。【参考方案2】:
正如 Jon 所提到的,您传递的是对数组的引用,而不是新数组。如果您不想修改旧数组,请使用Arrays.copyOf
,如下所示:
public class Runy
public static void main(String[] args)
Runy p = new Runy();
p.start();
void start()
long[] a1 = 3, 4, 5;
long[] a2 = fix(Arrays.copyOf(a1, a1.length));
System.out.println(a1[0] + ", " + a1[1] + ", " + a1[2]);
System.out.println(a2[0] + ", " + a2[1] + ", " + a2[2]);
long[] fix(long[] a3)
a3[1] = 7;
return a3;
您也可以阅读System.arraycopy()
。这是两种方法之间的区别:System.arraycopy() vs. Arrays.copyOf() in Java
【讨论】:
下面我将一个 int x=10 作为参数传递给 change(int a) 函数。原始 int x 的值发生了变化。那么相同的代码如何以不同的方式影响数组和 int 呢? 因为数组是来自整数的different
。也就是说,数组再次通过引用传递,而像 ins 这样的原始类型通过值传递。通过引用传递参数的含义是将数据的内存地址发送给函数,函数内的更改将指向与“原始数组”相同的内存地址。如果您不想更改数组,则需要向函数发送“新”副本。
@pelumi:不,Java根本不使用传递引用。引用是按值传递的,但这不是一回事。以上是关于当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
我可以将数组和变量作为参数传递给 C# 中的方法吗? [复制]