数组拷贝的 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种方式都是浅拷贝(面向对象编程),只有当数组中存的值是简单基本类型,才是深拷贝,引用类型是深拷贝。