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

  • Post author:
  • Post category:java



浅复制

:在堆内存中不会分配新的空间,而是增加一个引用变量和之前的引用指向相同的堆空间。


深复制

:在堆内存中分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。

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 + "]";
	}
}



版权声明:本文为qq_37964379原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。