新手初入Java(五)數組的四種拷貝

(一)四種拷貝方式

在日常編程的過程中,我們很有可能會用到對數組的拷貝。而拷貝主要有四種方式。

  • for循環對數組中的元素進行拷貝 (淺拷貝)。
  • clone (淺拷貝)
  • System.arrayCopy() (淺拷貝)
  • Arrays.copyof() (淺拷貝)

(1)for循環對數組中的元素進行拷貝

代碼示例:

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

(2)clone

代碼示例:

public class TestDemo{
 public static void main(String[] args) {
	int[] array={1,2,3,4,5};
	int[] array2=new int[array.length];
	array2=array.clone();
	System.out.println(Arrays.toString(array));
	System.out.println(Arrays.toString(array2));

}

(3)System.arrayCopy()

源碼如下:

public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

native代表native方法,即底層由C/C++實現,因此速度較快。
代碼示例:

public class TestDemo{
 public static void main(String[] args) {
        	int[] array={1,2,3,4,5};
        	int[] array2=new int[array.length];
        	System.arraycopy(array,0,array2,0,array.length);
        	System.out.println(Arrays.toString(array));
        	System.out.println(Arrays.toString(array2));
    }
}

(4)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;
    }

從源碼中可以看出Arrays.copyof調用的依舊是System.arrayCopy
代碼示例:

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

以上就是數組的四種拷貝方式,當然,它們相對於數組而言,都是淺拷貝。但是clone對於對象而言,是深拷貝。
淺拷貝就是兩個引用(地址)同時指向同一塊內存(對象)
如以下示例:

class TestArray {
    private int val = 10;
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
}
public class TestDemo{ 
 public static void main(String[] args) {
    TestArray[] testArrays = new TestArray[3];
    testArrays[0] = new TestArray();
    testArrays[1] = new TestArray();
    testArrays[2] = new TestArray();
    TestArray[] testArrays2 = Arrays.copyOf(testArrays,testArrays.length);
    System.out.println("=====拷貝後======");	
	for (int i = 0; i < testArrays.length; i++) {
    		System.out.print(testArrays[i].getVal() + " ");
}
    System.out.println();
    for (int i = 0; i < testArrays2.length; i++) {
        System.out.print(testArrays2[i].getVal()+ " ");
    }
    System.out.println();
    System.out.println("=====修改後======");

    testArrays2[0].setVal(10000);

    for (int i = 0; i < testArrays.length; i++) {
        System.out.print(testArrays[i].getVal()+ " ");
    }
    System.out.println();
    for (int i = 0; i < testArrays2.length; i++) {
        System.out.print(testArrays2[i].getVal()+ " ");
    }
}

在這個代碼中,如圖所示:
淺拷貝

testArrays[0]和testArrays2[0]同時指向val,在修改第一個值之後,testArrays[0]和testArrays2[0]同時變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章