浅复制
:在堆内存中不会分配新的空间,而是增加一个引用变量和之前的引用指向相同的堆空间。
深复制
:在堆内存中分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。
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 + "]";
}
}