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; //改变b数组的第一个元素
for(int i : a)//打印a数组
System.out.print(i);//输出结果为0234
System.out.println();
/**
* 可以看到,改变b数组元素的值,其实是改变a元素的值;
* 说明b[]=a;这种数组复制方法是一种浅复制,也就是对a数组的引用。
*/
///////////clone()方法////////////////
int[] c={1,2,3,4};
int[] d=c.clone();
for(int i : d)
System.out.print(i);
System.out.println();
d[0]=0;//改变d数组的第一个元素
for(int i : c)//打印c数组
System.out.print(i);//输出结果为1234
System.out.println();
/*
* 可以看到,改变d数组元素的值,并没有对原数组造成影响;
* 说明d=c.clone();这种数组方法是将原数组的元素完全复制到新数组,即深复制;
* 复制后的数组和原数组有不同的内存空间,是相互独立的。
*
*/
///////////////arrayCopy()方法///////////
int[] e={1,2,3,4};
int[] f = new int[4];//初始化数组元素全为0;
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;//改变f数组的第一个元素
for(int i : e)//打印e数组
System.out.print(i);//输出为1234
System.out.println();
/**
* 可以看到,改变f数组的值,并不影响原数组e的值;
* 和clone()方法一样,也是深复制。
*/
/**
* 对于二维数组,和一维数组一样;
* clone
*/
int[][] g={{1,2},{3,4}};
int[][] h=g;
h[0][0]=0;//改变h数组的第一个元素;
for(int[] i : g)//打印原数组
for(int j : i)
System.out.print(j);//输出结果:0234
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);//输出结果:1234
System.out.println();
l[0][0]=0;//改变l数组的第一个元素;
for(int[] i : k)//打印原数组
for(int j : i)
System.out.print(j);//输出结果:0234
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);//输出结果:1000
System.out.println();
n[0][0]=0;//改变l数组的第一个元素;
for(int[] i : m)//打印原数组
for(int j : i)
System.out.print(j);//输出结果:0234
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()方法;
*/
}
}
网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022