Java二维数组数组深复制实验

一维数组

使用Arrays.copyOf()

        int[] one = {1, 2, 3, 4, 5};
        int[] one_copy = Arrays.copyOf(one, 5);
        one[1] = 999;
        System.out.println(Arrays.toString(one));
        System.out.println(Arrays.toString(one_copy));
        one_copy[2] = 999;
        System.out.println(Arrays.toString(one));
        System.out.println(Arrays.toString(one_copy));

运行结果

[1, 999, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 999, 3, 4, 5]
[1, 2, 999, 4, 5]

可以看到,对于一维数组,无论修改原数组,还是修改复制后的数组,都不会互相影响。

System.arraycopy()

        int[] one = {1, 2, 3, 4, 5};
        int[] one_copy = new int[5];
        System.arraycopy(one, 0, one_copy, 0, 5);
        one[1] = 999;
        System.out.println(Arrays.toString(one));
        System.out.println(Arrays.toString(one_copy));
        one_copy[2] = 999;
        System.out.println(Arrays.toString(one));
        System.out.println(Arrays.toString(one_copy));

运行结果

[1, 999, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 999, 3, 4, 5]
[1, 2, 999, 4, 5]

同样,对于一维数组,无论修改原数组,还是修改复制后的数组,都不会互相影响。

二维数组

        int[][] two = {{1, 2, 3}, {4, 5, 6}};
//        int[][] two_copy = new int[2][3];
//        System.arraycopy(two, 0, two_copy, 0, 2);
        int[][] two_copy = Arrays.copyOf(two, 2);
        two[0][1] = 999;
        System.out.println(Arrays.deepToString(two));
        System.out.println(Arrays.deepToString(two_copy));
        two_copy[1][2] = 999;
        System.out.println(Arrays.deepToString(two));
        System.out.println(Arrays.deepToString(two_copy));

运行结果

[[1, 999, 3], [4, 5, 6]]
[[1, 999, 3], [4, 5, 6]]
[[1, 999, 3], [4, 5, 999]]
[[1, 999, 3], [4, 5, 999]]

可以看到,修改原数组后新数组也会被修改,修改新数组原数组也会被修改。
原因是对第二维每个数组的复制是浅复制。
正确的深复制方法是,遍历第一维,对第二维使用System.arraycopy()或Arrays.copyOf()

        int[][] two = {{1, 2, 3}, {4, 5, 6}};
        int[][] two_copy = new int[2][3];
        for (int i = 0; i < two_copy.length; i++) {
//            two_copy[i] = Arrays.copyOf(two[i], 3);
            System.arraycopy(two[i], 0, two_copy[i], 0, 3);
        }
        two[0][1] = 999;
        System.out.println(Arrays.deepToString(two));
        System.out.println(Arrays.deepToString(two_copy));
        two_copy[1][2] = 999;
        System.out.println(Arrays.deepToString(two));
        System.out.println(Arrays.deepToString(two_copy));

运行结果如下

[[1, 999, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
[[1, 999, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 999]]

这样对两个二维数组的改动不会互相影响。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值