当前位置: 代码迷 >> 综合 >> Java中数组的浅复制与深复制以及System.arraycopy()方法
  详细解决方案

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

热度:19   发布时间:2023-12-02 00:55:55.0

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

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();}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}
}
  相关解决方案