天天看点

java数组复制分析

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