首先,我们看下面两段程序:
(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的引用对象。
复制数组切勿使用引用传递的方法,不但会产生内存垃圾,不适当的操作也会改变原来的数组。