浅复制:在堆内存中不会分配新的空间,而是增加一个引用变量和之前的引用指向相同的堆空间。
深复制:在堆内存中分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。
Java中基本类型数组与对象类型数组都可以复制,而通过**=号简单的复制,复制了对象的引用–而不知对象本身的拷贝,被称为浅复制**,此时增加一个引用变量和之前的引用指向相同的堆空,而通过System.arraycopy() 复制时(也可以通过循环单个对象复制,这里以System.arraycopy()为例),会为复制的新对象分配新空间,将之前的数组堆内存中的内容拷贝到新的空间中。称为深复制。
System.arraycopy()方法
用System.arraycopy()方法复制数组比用for循环复制要快的多,而且System.arraycopy()方法针对所有方法进行了重载。
arraycopy(Object src, int srcPos, Object dest, int destPos, int 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));
}
}
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 + "]";
}
}