基本数据类型特点:直接存储在栈(stack)中的数据
引用数据类型特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
问题:
以下四种拷贝方式中,哪一种拷贝方式速度最快?
答:System.arraycopy,在源码当中我们可以看到,其被native所修饰,底层由c/c++所实现,执行速度上要快很多。
四种"深拷贝".
import java.util.Arrays;
public class TestDemo {
//引用.clone();克隆这个引用所指向的对象,这个引用所指向的对象就生成了一个副本,深拷贝!
public static void main(String[] args) {
int [] array1={1,2,3,4,5};
int [] array2=array1.clone();
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.out.println("------------------------");
array2[0]=1000;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
// System.arraycopy是深拷贝,因为修改array2的值array1的值不会受到影响。
public static void main3(String[] args) {
int [] array1={1,2,3,4,5};
int [] array2=new int[array1.length];
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.arraycopy(array1,0,array2,0,array1.length);
System.out.println("------------------------");
array2[0]=1000;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
//Arrays.copyOf(array1,array1.length)是深拷贝,共两个参数
public static void main2(String[] args) {
int [] array1={1,2,3,4,5};
int []array2=Arrays.copyOf(array1,array1.length);
}
//数组的深拷贝,修改array2的值,array1的值不会受到影响
public static void main1(String[] args) {
int [] array1={1,2,3,4,5};
int [] array2=new int[array1.length];
for(int i=0;i<array1.length;i++){
array2[i]=array1[i];
}
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
注意:从本质上来说,这四种拷贝方式都是浅拷贝!!!只不过刚刚的数组当中存放的是简单类型,后面会使用接口cloneable来实现深拷贝