zoukankan      html  css  js  c++  java
  • 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()方法;
             */
    
    
    
        }
    
    }
    
  • 相关阅读:
    取消 Vue 中格式编译警告
    Vue 中提示报错 handlers[i].call is not a function解决方法
    PhpStorm 配置链接远程虚拟机
    Java 类提供了自定义的构造方法,那么类的默认构造不会被调用
    2019.9.30极限测试 04.JAVA语言课堂测试试卷-极限测试
    程序员修炼之道+从小工到专家 9月份读后感
    2019.9.23 作业2
    2019.9.23 作业1
    原码,补码,反码区分
    9.16日上课总结
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286838.html
Copyright © 2011-2022 走看看