public class ArrayCopy {
public static void main(String[] args) {
int[] a={1,2,3,4};
int[] b=a;
for(int i : b)
System.out.print(i);
System.out.println();
b[0]=0;
for(int i : a)
System.out.print(i);
System.out.println();
/**
* 可以看到,改变b数组元素的值,其实是改变a元素的值;
* 说明b[]=a;这种数组复制方法是一种浅复制,也就是对a数组的引用。
*/
int[] c={1,2,3,4};
int[] d=c.clone();
for(int i : d)
System.out.print(i);
System.out.println();
d[0]=0;
for(int i : c)
System.out.print(i);
System.out.println();
int[] e={1,2,3,4};
int[] f = new int[4];
System.arraycopy(e, 0, f, 0, 1);
/**
* System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
* 参数意义:
* src:原数组名
* srcPos:指定位置开始复制,从索引为srcPos处
* dest:目标数组名
* destPos:复制到目标数组的指定位置,从索引destPos处开始
* length:指定要复制的长度,小于src.length
*/
for(int i : f)
System.out.print(i);
System.out.println();
f[0]=0;
for(int i : e)
System.out.print(i);
System.out.println();
/**
* 可以看到,改变f数组的值,并不影响原数组e的值;
* 和clone()方法一样,也是深复制。
*/
/**
* 对于二维数组,和一维数组一样;
* clone
*/
int[][] g={{1,2},{3,4}};
int[][] h=g;
h[0][0]=0;
for(int[] i : g)
for(int j : i)
System.out.print(j);
System.out.println();
int[][] k={{1,2},{3,4}};
int[][] l=k.clone();
for(int[] i : l)
for(int j : i)
System.out.print(j);
System.out.println();
l[0][0]=0;
for(int[] i : k)
for(int j : i)
System.out.print(j);
System.out.println();
int[][] m={{1,2},{3,4}};
int[][] n=new int[2][2];
System.arraycopy(m, 0, n, 0, 1);
for(int[] i : n)
for(int j : i)
System.out.print(j);
System.out.println();
n[0][0]=0;
for(int[] i : m)
for(int j : i)
System.out.print(j);
System.out.println();
/**
* 可以看到,该写法对二维数组的复制实质上是对数组的数组的引用,是浅复制;
* 改变一下System.arraycopy(m, 0, n, 0, 1)为System.arraycopy(m[0], 0, n[0], 0, 1);
* 原数组输出变为1234
* 可以看出,此时为深复制;
*
*/
/**
* 总结:1.对于一维数组,直接赋值法实质上是对原数组的一个引用,为浅复制,
* clone()和arrayCopy()方法则是深复制;
* 2.对于二维数组,直接赋值法、clone()和arrayCopy()方法都是对原数组的引用,是浅复制,
* 如果要完全复制二维数组,则需先引用到第一层一维数组,在调用clone()和arrayCopy()方法;
*/
}
}