数组拷贝(浅拷贝和深拷贝)

数组拷贝的 4 种方法

for循环拷贝

public static void main(String[] args){
	int[] array = {1,2,3,4,5};
	int[] newArray = new int[array.length];
	for(int i = 0; i < array.length; i++){
		newArray[i] = array[i];
	}
	System.out.println(Arrays.toString(array));//[1,2,3,4,5]
	System.out.println(Arrays.toString(newArray));//[1,2,3,4,5]
}

Arrays.copyOf

Arrays.copyOf(int[] original,int newLength);

System.arraycopy

System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
//src:原数组
//srcPos:原数组的位置(从这个位置开始拷贝)
//dest:拷贝后的数组
//destPos:拷贝的数组的开始位置
//length:拷贝的长度

Arrays.copyOf和System.arraycopy的区别

  • Arrays.copyOf 方法有返回值
  • System.arraycopy 无返回值,是 native 本地方法,底层由C、C++代码写成,在本地方法栈上开辟内存,速度更快。

clone方法

产生当前对象的一个副本,是 object 的方法

array.clone();

浅拷贝和深拷贝

深拷贝:拷贝完成后,通过一个引用修改它的值之后,不影响原来的值。

public static void main(String[] args){
	int[] array = {1,2,3,4,5};
	int[] newArray = Arrays.copyOf(array,array.length);
	System.out.println(Arrays.toString(array));//[1,2,3,4,5]
	System.out.println(Arrays.toString(newArray));//[1,2,3,4,5]

	newArray[0] = 99;
	System.out.println(Arrays.toString(array));//[1,2,3,4,5]
	System.out.println(Arrays.toString(newArray));//[99,2,3,4,5]
} 

但是当一个数组中存的值是地址,将这个数组array拷贝完成后,新数组指向的对象也是原数组指向的对象,如果通过新数组中的地址修改地址指向的对象,那么原数组中这个地址指向的对象也发生了改变——浅拷贝。

实际上上述所讲的4种方式都是浅拷贝(面向对象编程),只有当数组中存的值是简单基本类型,才是深拷贝,引用类型是深拷贝。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值