小垃圾学Java-数组的四种拷贝

一.两种拷贝的区别: 浅拷贝:复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。 深拷贝:将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝。 二.四种拷贝: for clone System.arrayCopy() Arrays.copyOf() 三.两种类型: 基本类型:基本数据类型是按值访问的,可以直接操作保存在变量中的实际值。 引用类型:引用数据类型是保存在堆内存中的对象。与其他语言的不同是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。 引用类型的图例: 四.四种拷贝类型的介绍: ①for 通过循环赋值来将元数组里面的元素拷贝到目标数组 基本类型: 引用类型: 先定义一个类赋值 ②clone

Person p = new Person(23, "zhang");
	Person p1 = (Person) p.clone();
	
	System.out.println(p);
	System.out.println(p1);

从打印结果可以看出,两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量: com.pansoft.zhangjg.testclone.Person@2f9ee1ac com.pansoft.zhangjg.testclone.Person@67f1fba0 ③ System.arrayCopy() /**

    public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); Object src:源数组 srcPos:源数组的起始位置 并不是一定就是0号位置 Object dest:目的地数组 destPos:目的地数组的起始位置 length:拷贝源数组的多长 浅拷贝 */ native ====> 底层由C/C++实现,所以很快。

(基本类型代码) import java.util.*; public class System_Arraycopy { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,7,8,9}; int[] brray = new int[array.length]; System.arraycopy(array,0,brray,0,array.length); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(brray)); brray[0] = 1000; System.out.println("================="); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(brray)); } } ④ Arrays.copyOf() (源码:)

    public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } original:原始的数组 newLength:新的长度 *Arrays.copyOf ===》底层调用的是System.arraycopy(); (引用类型代码)

(基本类型代码) import java.util.*; public class TestArray1 { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,7,8,9}; int[] brray = Arrays.copyOf(array,array.length); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(brray)); brray[0] = 1000; System.out.println("================="); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(brray)); } }

经验分享 程序员 微信小程序 职场和发展