java数组复制分析

来源:互联网 发布:navicat for mysql下载 编辑:程序博客网 时间:2024/05/21 09:16
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()方法;         */    }}
0 0
原创粉丝点击