java数组拷贝

本文详细介绍了Java中数组的深拷贝和浅拷贝概念,通过实例展示了clone()、copyOf()、arraycopy()方法在简单类型数组和多维数组中的应用。对于多维数组,必须通过循环实现深拷贝,以确保每个一维子数组都在新的内存地址中。文章还探讨了这些拷贝方法在多维数组拷贝时的区别和注意事项。
摘要由CSDN通过智能技术生成

浅拷贝:

数组如果存放引用类型地址,进行拷贝后,原数组中存放的地址拷贝到新数组中,此时是两个相同的引用指向一个对象。如果原数组把内容更改,拷贝的数组内容对应也做更改。

深拷贝:

新数组的地址与原数组的地址不同,不是简单的引用拷贝。原数组内容改变时,新数组的内容不会改变。

数组内容是简单类型的,如int、float甚至String类型,使用clone()、copyOf()、arraycopy()方法拷贝,实现的都是深拷贝。新的数组放在一个新的地址中。

		int arr1[] = {1,2,3};
		int arr2[] = arr1.clone();
		int arr3[] = Arrays.copyOf(arr1, arr1.length);
		int arr4[] = new int[3];
		System.arraycopy(arr1, 0, arr4, 0, arr1.length);
		arr1[2] = 9; //改变arr1 看看复制的数组有无改变
		System.out.println("clone方法克隆:");
		System.out.println(Arrays.toString(arr2)); //[1, 2, 3]
		System.out.println("copyOf方法克隆:");
		System.out.println(Arrays.toString(arr3)); //[1, 2, 3]
		System.out.println("arraycopy方法克隆:");
		System.out.println(Arrays.toString(arr4)); //[1, 2, 3]

但一个多维数组的拷贝,不能直接用以上三个方法直接拷贝。而应该用for循环,把多维数组分成一维的数组来拷贝,这样每个一维数组都是一个新的地址,组合成的多维数组也是新的地址。

		int arr1[][] = {{1,1,1},{2,2,2},{3,3,3}};
		
		int arr2[][] = new int[3][3];
		for(int i = 0;i < 3;i++) {
			arr2[i] = arr1[i].clone();
		}
		
		int arr3[][] = new int[3][3];
		for(int i = 0;i < 3;i++) {
			arr3[i] = Arrays.copyOf(arr1[i], arr1[i].length);
		}

		int arr4[][] = new int[3][3];
		for(int i = 0;i < 3;i++) {
			System.arraycopy(arr1[i], 0, arr4[i], 0, arr1[i].length);
		}
		
		arr1[2][2] = 9; //改变arr1 看看复制的数组有无改变
		System.out.println("clone方法克隆:");
		for(int i = 0;i < 3;i++) {
			System.out.println(arr2[i]); //[I@15db9742 [I@6d06d69c [I@7852e922
		}
		System.out.println("copyOf方法克隆:");
		for(int i = 0;i < 3;i++) {
			System.out.println(arr3[i]); //[I@4e25154f [I@70dea4e [I@5c647e05
		}

		System.out.println("arraycopy方法克隆:");
		for(int i = 0;i < 3;i++) {
			System.out.println(arr4[i]); //[I@33909752 [I@55f96302 [I@3d4eac69
		}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值