Java数组的深/浅复制(拷贝)
Java拷贝数组的方法:
- 循环赋值
- System.arraycopy
- Arrays.copyOf
- Object.clone
就下面三种方法而言,拷贝数组都为浅拷贝。若要实现深拷贝该怎么办呢?别急,接下来先介绍这三种方法的用法。
1. System.arraycopy (浅拷贝)
这个是由Java提供的拷贝方法,由native可以开出该方法的具体实现是由C/C++写的,因此拷贝速度会快于java的循环赋值拷贝。该方法是浅拷贝,即当源数组的元素为对象时,拷贝到新数组时只是将该对象的引用赋值到新数组的对应元素上,两数组中的元素指向的是同一个对象。
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
形参:
-
src —— 待拷贝数组(源数组)
-
srcPos —— 源数组中需拷贝的起始位置
-
dest —— 目标数组
-
destPos —— 目标数据中的起始位置
-
length —— 需拷贝的元素个数
2. Arrays.copyOf (浅拷贝)
该方法是java.util.Arrays中的方法,也是浅拷贝。详见下图源码
public static <T> T[] copyOf(T[] original, int newLength)
形参:
- original —— 待拷贝数组(源数组)
- newLength —— 新数组的数组长度
返回值:
- T[] —— 与源数组同类型且已拷贝成功的新数组
由源码可见,创建新数组后,调用的是System.arraycopy拷贝方法,因此实则还是浅拷贝。