java学习笔记——多维数组的复制

这篇博客探讨了Java中数组复制的不同方法,包括一维数组的clone、System.arraycopy和Arrays.copyOf,以及二维数组的复制策略,强调了浅拷贝和深拷贝的区别,提供了实现深拷贝的解决方案。
摘要由CSDN通过智能技术生成

在处理某些数组问题时,总会遇到需要使用一个与目标数组同等空间的数组,或需要对其进行复制。
但在java当中,数组的变量名代表的仅仅是其在内存中的物理地址而不是其数组内容。

//初始化数组
int [] nums1 = new int[]{1,2,3,4,5,6,7};
int [] nums2 = new int[nums1.length];      //创建一个与nums1等同空间的数组以便复制;
nums2 = nums1;

若仅用变量名赋值会导致nums2的地址指向了nums1的地址, 而原先nums2的数组仍然为刚创立时的空数组,而这并不能达到我们预想的那样,故数组的复制还需使用其他方法。

1、一维数组复制

方法1:简单的for或增强for循环赋值,不再描述。
方法2:clone拷贝:

public static void main(String[] args) {
        int[] nums1 = new int[]{1,2,3,4,5,6};
        int[] nums2 = new int[nums1.length];
        nums2=nums1.clone();
    }

复制后 nums2与nums1内容相同,但地址指向不同;
方法3: System.arraycopy:

System.arraycopy(Object src,int srcPos, Object dest,int destPos ,int length)

src : 源数组

srcPos:源数组的开始位置 0 开始拷贝的位置

dest:拷贝到目标数组

destPos:拷贝到目标数组的位置

length:需要复制的长度

public static void main(String[] args) {
        int[] nums1 = new int[]{1,2,3,4,5,6};
        int[] nums2 = new int[nums1.length];
        System.arraycopy(nums1,0,nums2,0,nums1.length);
        System.out.println(nums1.equals(nums2));   //不同地址
        System.out.println(Arrays.toString(nums2));  //数组元素相同
    }

方法4:Arrays.copyof
Arrays.copyOf(array, int newLength);
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。

public static void main(String[] args) {
        int[] nums1 = new int[]{1,2,3,4,5,6};
        int[] nums2 = new int[nums1.length];
        nums2 = Arrays.copyOf(nums1,nums1.length);
        System.out.println(nums1.equals(nums2));
        System.out.println(Arrays.toString(nums2));
    }

2、二维数组复制方法

方法1:双重for循环
不再描述

方法2:clone()

int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
        int m = nums1.length;
        int n = nums1[0].length;
        int[][] nums2 = new int[m][n];

        nums2 = nums1.clone();

若使用如上方法,虽然nums2的地址与nums1的地址不同,但是num2中的数组地址与nums1中的数组地址相同,即变动nums2中的元素时nums1中的元素也会随之变动。
这是因为二维数组的原理是 :一个一维数组中,存着多个别的一位数组的地址。
故直接clone,只会将数组内的二层数组地址进行复制。

为了避免此结果,则应该

int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
        int m = nums1.length;
        int n = nums1[0].length;
        int[][] nums2 = new int[m][n];

        for(int i = 0 ;i<m;i++)
        	nums2[i] = nums1[i].clone();   //进行逐层的clone就可以避免上述问题。

方法3:Arrays.copyOf与 System.arraycopy

与方法二一样,若直接进行复制则只是浅拷贝,
需要逐层复制才能达到深拷贝的效果。

//copyOf
int[][] nums1 = new int[][]{{1,2,3},{2,3,4},{4,5,6}};
        int m = nums1.length;
        int n = nums1[0].length;
        int[][] nums2 = new int[m][n];

        for(int i = 0 ;i<m;i++)
        	nums2[i] = Arrays.copyOf(nums1[i],nums1[i].length); 
//System.arraycopy
for(int i = 0 ;i<m;i++)
        System.arraycopy(nums1[i],0,nums2[i],0,nums1[i].length);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值