1. 程式人生 > >Java clone,System.arraycopy的區別

Java clone,System.arraycopy的區別

      今天看Effective Java 中,對於陣列的clone和System.arraycopy是否是每一個元素深拷貝還是隻是簡單的將原陣列的引用值拷貝存在疑慮,於是寫了段程式碼測試。

import java.util.Arrays;


public class ArraysCopyTest {
	     public static  void main(String [] args){
    	 Person[] arrays =new  Person[2];
    	 arrays[0]=new Person("張三");
    	 arrays[1]=new Person("李四");
    	 Person[] arrayCopy =new  Person[2];
    	 System.arraycopy(arrays, 0, arrayCopy, 0, 2);
    	 arrayCopy[0].name="王五";
    	 System.out.println("arrys[0]:"+arrays[0].name);
    	 System.out.println("arraycopy[0]:"+arrayCopy[0].name);
    	 Person[] arrayClone =new  Person[2];
    	 arrayClone=arrays.clone();
    	 arrayClone[0].name="趙二";
    	 System.out.println("arrys[0]:"+arrays[0].name);
    	 System.out.println("arrayclone[0]:"+arrayClone[0].name);
    	 Person[] arrayDeepClone =new  Person[2];
    	 for(int i=0;i<arrays.length;i++){
    		 arrayDeepClone[i]=(Person)arrays[i].clone();
    	 }
    	 arrayDeepClone[0].name="張大";
    	 System.out.println("arrys[0]:"+arrays[0].name);
    	 System.out.println("arrayDeepClone[0]:"+arrayDeepClone[0].name);
     }
}
class Person implements Cloneable{
	public String name;
	public Person(String name){
		this.name=name;
	}
	@Override public Person clone(){
		try{
			return (Person) super.clone();
		}catch (CloneNotSupportedException e){
			throw new AssertionError();
		}
	}
}

執行結果如下

arrys[0]:王五
arraycopy[0]:王五
arrys[0]:趙二
arrayclone[0]:趙二
arrys[0]:趙二
arrayDeepClone[0]:張大

發現數組的clone和 System.arraycopy都只是將陣列值簡單的賦值,並不會為每個元素都執行拷貝。Arrays.copyOf通過System.arraycopy實現,所以一樣。而如果要實現陣列的深拷貝,可以遍歷每一個,然後呼叫clone方法。