目录
前言
本文大部分内容出自:https://s-ajie.blog.csdn.net/article/list/3
笔者对相关内容进行了整理和补充。
深拷贝与浅拷贝
- 浅拷贝:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅拷贝出来的对象也会相应的改变。
- 深拷贝:在计算机中开辟一块新的内存地址用于存放拷贝的对象。
因此,深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
方式一:System.arraycopy()
效率最高。
进入System
类,发现arraycopy()
是一个本地方法:
public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
数组元素为基本类型
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] array1 = new int[]{
1,2,8,7,6};
int[] array2 = new int[array1.length];
System.arraycopy(array1, 0, array2, 0, array1.length);
System.out.println("array1 = " + Arrays.toString(array1));
System.out.println("array2 = " + Arrays.toString(array2));
System.out.println("=========================");
array2[0] = 100;
System.out.println("array1 = " + Arrays.toString(array1));
System.out.println("array2 = " + Arrays.toString(array2));
}
}
输出结果:
array1 = [1, 2, 8, 7, 6]
array2 = [1, 2, 8, 7, 6]
=========================
array1 = [1, 2, 8, 7, 6]
array2 = [100, 2, 8, 7, 6]
由结果可以看出,当对复制数组的某个元素进行改变时,并不影响被复制数组对应元素,即对于基本数据类型来说System.arraycopy() 方法是深拷贝。
内存分析
数组元素为引用类型
class TestArray{
private int val = 10;
public void setVal(int val){
this.val = val;
}
public int getVal(){
return this.val;
}
}
public class TestDemo {
/**数组输出方法 */
public static void printArray(TestArray[] array){
for(int i = 0;i < array.length;<