数组复制:关于java中引用传递的一个例子
首先,我们看下面两段程序:
(1).
1 int[] a = {1, 2, 3, 4}; 2 int[] b = new int[4]; 3 b = a;
(2).
1 int[] a = {1, 2, 3, 4}; 2 int[] b = new int[4]; 3 int i = 0; 4 for(int num:a){ 5 b[i++] = num; 6 }
赋值之后,数组b的值都是{1, 2, 3, 4},但是这两种方法是有实质区别的。
首先,数组的初始化过程是这样的:对于int[] a;首先定义一个数组名a,然后将a这个变量进栈,当然这里没有对a进行初始化,所以a是一个空引用。对于int[] a = {1, 2, 3, 4};首先也是定义一个变量a并将a进栈,然后在堆区创建一个对象{1, 2, 3, 4},最后建立a对对象{1, 2, 3, 4}的引用。
其次,值传递和引用传递,第一种方法,实际上是改变了a的引用对象,a、b引用同一个对象了,这样也会产生一个不良后果,b原来引用的对象不再被引用,也就产生了一块内存垃圾。如下图所示:
第二种方法,是对b引用的内存区域的赋值,并未改变b的引用对象。
复制数组切勿使用引用传递的方法,不但会产生内存垃圾,不适当的操作也会改变原来的数组。
如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。