Java中数组的浅复制与深复制以及System.arraycopy()方法

浅复制:在堆内存中不会分配新的空间,而是增加一个引用变量和之前的引用指向相同的堆空间。
深复制:在堆内存中分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。

Java中基本类型数组与对象类型数组都可以复制,而通过**=号简单的复制,复制了对象的引用–而不知对象本身的拷贝,被称为浅复制**,此时增加一个引用变量和之前的引用指向相同的堆空,而通过System.arraycopy() 复制时(也可以通过循环单个对象复制,这里以System.arraycopy()为例),会为复制的新对象分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。称为深复制

System.arraycopy()方法
用System.arraycopy()方法复制数组比用for循环复制要快的多,而且System.arraycopy()方法针对所有方法进行了重载。
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
参数:

  • src - 源数组。
  • srcPos - 源数组中的起始位置。
  • dest - 目标数组。
  • destPos - 目标数据中的起始位置。
  • length - 要复制的数组元素的数量。

浅复制举例代码

浅复制对象类型


public class TestArray {
	public static void main(String[] args) {
		Person[] pers = new Person[3];  //Person类代码在文章最后
		Arrays.fill(pers, new Person("tom", 10));
		System.out.println(Arrays.toString(pers));
		
		Person[] pers1 = new Person[3];
		pers1=pers;
		Arrays.fill(pers1, new Person("jack", 20));
		System.out.println(Arrays.toString(pers1));
		
		System.out.println(Arrays.toString(pers));
	}
}

输出
在这里插入图片描述
基本类型类型

import java.util.Arrays;
public class Demo2 {
	public static void main(String[] args) {
		int[] a = new int[] { 1, 2, 3 };
		int[] b = new int[3];//不管这里new不new,用=复制,都是浅复制
		b=a;
		for (int i = 0; i < b.length; i++) {
			b[i] = 10 + i;
		}
		System.out.println("a:" + Arrays.toString(a));
		System.out.println("b" + Arrays.toString(b));
	}
}

输出
在这里插入图片描述

深复制举例代码

深复制对象类型

import java.util.Arrays;
public class TestArray {
	public static void main(String[] args) {
		Person[] pers = new Person[3];
		Arrays.fill(pers, new Person("tom", 10));
		System.out.println(Arrays.toString(pers));

		Person[] pers1 = new Person[3];
		System.arraycopy(pers, 0, pers1, 0, pers.length);
		Arrays.fill(pers1, new Person("jack", 20));
		System.out.println(Arrays.toString(pers1));
		
		System.out.println(Arrays.toString(pers));
	}
}

输出
在这里插入图片描述
深复制基本类型

import java.util.Arrays;
public class Demo2 {
	public static void main(String[] args) {
		int[] a = new int[] { 1, 2, 3 };
		int[] b = new int[3];
		System.arraycopy(a, 0, b, 0, a.length);
		for (int i = 0; i < b.length; i++) {
			b[i] = 10 + i;
		}
		System.out.println("a:" + Arrays.toString(a));
		System.out.println("b" + Arrays.toString(b));
	}
}

输出
在这里插入图片描述

Person类代码

public class Person {
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值