System.arraycopy—数组深拷贝与浅拷贝

  以前只是知道System里面有一个native静态方法叫做arraycopy()。这个方法可以用来进行数组复制吗,今天用到了,感觉得把他的参数说明记个笔记,主要是为了方便自己查阅,大佬可忽略。


  上代码:

public static void main(String[] args) {
        double[] arr1= {1,3};
        double[] arr2= {1,4};
        double[] sum=new double[arr1.length+arr2.length];
        /**
         * 第一个参数是被copy的数组
         * 第二个参数从被copy的数组的什么位置开始复制,这里是0所以是从第一个元素开始复制
         * 第三个参数是结果数组
         * 第四个参数是从结果数组的什么位置开始接收
         * 第五个参数是需要复制的长度,这里是arr1.length,也就是把arr1全部复制到sum中
         */

        System.arraycopy(arr1,0,sum,0,arr1.length);
        System.arraycopy(arr2,0,sum,arr1.length,arr2.length);
        for (double d : sum) {
            System.out.println(d);
        }
    }


  运行结果如下:
在这里插入图片描述

  注意:

  对于一维数组来说,arraycopy复制属性值传递,修改副本 不会影响原来的值,也就是深拷贝。

  对于多维数组或者存放对象的一维数组,复制结果是:一维的引用变量 传递给 副本的一维数组。修改副本时,会影响原来的数组,也就是浅拷贝

  来验证一下:

  是一维数数组时,先进行arraycopy,然后修改副本数组的元素,代码如下:

  public static void main(String[] args) {
        double[] arr1= {1,3};
        double[] arr2= {1,4};
        double[] sum=new double[arr1.length+arr2.length];
        System.arraycopy(arr1,0,sum,0,arr1.length);
        System.arraycopy(arr2,0,sum,arr1.length,arr2.length);
         //修改sum中位置为0和2的元素的值
        sum[0]=99;
        sum[2]=99;
        System.out.println("arr1:");
        for (double d : arr1) {
            System.out.println(d);
        }
        System.out.println("arr2:");
        for (double d : arr2) {
            System.out.println(d);
        }
        System.out.println("sum:");
        for (double d : sum) {
            System.out.println(d);
        }
    }


  运行结果:
在这里插入图片描述


  可以看到,修改副本数组并不会对原数组造成影响

  那如果是多维数组或者元素为对象的一维数组会怎么样呢,来试试

  代码如下:

   public static void main(String[] args) {
        int[] a={1,2,3};
        int[] b={4,5,6};
        int[][] sum= {a,b};
        int[][] copy= new int[2][3];
        System.arraycopy(sum,0,copy,0,sum.length);
//        for (int i = 0; i < copy.length; i++) {
//            for (int x : copy[i]) {
//                System.out.print(x);
//            }
//            System.out.println("");
//        }
        //修改副本数组
        copy[0][0]=1;
        copy[0][1]=1;
        copy[0][2]=1;
        //查看原数组是否发生改变
        for (int i : a) {
            System.out.println(i);
        }
    }


  结果吐下:
在这里插入图片描述

  可以看到,原数组a的值被改变了。

  由此可以得出结论,System.arraycopy方法只有复制一维数组的时候才是深拷贝,此时复制之后的数组与原数组没有任何关系,修改两个数组中任意一个都不会对另外一个产生影响
  但是当复制的数组是多维数组或者元素为对象的一维数组时,副本数组的元素一旦被修改,原数组的元素也会被同步修改,此时,数组中的元素实际在堆中只有一份,但是每个元素都有两个引用(也就是说原数组和副本数组引用的是同一个对象),此时的复制就是浅拷贝。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值