1. 程式人生 > >一維陣列拷貝的方式:for迴圈

一維陣列拷貝的方式:for迴圈

說到陣列拷貝,先看看淺拷貝與深拷貝的概念。

概括起來講,淺拷貝就是指兩個物件公用一個值,一個的改變了另一個也會隨之改變,深拷貝則是兩個物件雖然值相等,但是相互獨立互不影響。

第一種一維陣列的拷貝方式:for迴圈實現陣列拷貝

看以下例子:

import java.util.Arrays;
public class TestDemo {
    public static void main(String[] args) {

        int[] array1 = new int[]{1, 2, 8, 7, 6};
        int[] array2 = new
int[array1.length]; for (int i = 0;i < array1.length;i++){ array2[i] = array1[i]; } System.out.println("array1 = " + Arrays.toString(array1)); System.out.println("array2 = " + Arrays.toString(array2)); System.out.println("======================"
); array2[0] = 100; System.out.println("array1 = " + Arrays.toString(array1)); System.out.println("array2 = " + Arrays.toString(array2)); } }

這段程式的輸出結果是:

array1 = [1, 2, 8, 7, 6]
array2 = [1, 2, 8, 7, 6]
======================
array1 = [1, 2, 8, 7, 6]
array2 = [100, 2, 8, 7, 6]

由結果可以看出,當對複製陣列的某個元素進行改變時,並不影響被複制陣列對應元素,即對於基本資料型別來說for迴圈語句是深拷貝

看一下記憶體分析:
記憶體分析

當物件不是基本資料型別,而是引用資料型別時,情況又是怎樣呢?看以下例子:

class TestArray{
    private int val = 10;
    public void setVal(int val){
        this.val = val;
    }
    public int getVal(){
        return this.val;
    }
}

public class TestDemo {

    /**陣列輸出方法 */
    public static void printArray(TestArray[] array){
        for(int i = 0;i < array.length;i++){
            System.out.print(array[i].getVal()+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        TestArray[] array1 = new TestArray[3];
        // 陣列引用賦值
        for (int i = 0; i < array1.length; i++){
            array1[i] = new TestArray();
        }

        TestArray[] array2 = new TestArray[array1.length];
        // 陣列for迴圈複製
        for (int i = 0; i < array2.length; i++){
            array2[i] = array1[i];
        }

        printArray(array1);
        printArray(array2);
        System.out.println("==========");

        array2[0].setVal(100);;
        printArray(array1);
        printArray(array2);
    }
}

這段程式的輸出結果是:

10 10 10 
10 10 10 
==========
100 10 10 
100 10 10

由結果可以看出,當對複製陣列的某個元素進行改變時,被複制陣列對應元素也隨之改變,即對於引用資料型別來說for迴圈語句是淺拷貝
看一下記憶體分析:
記憶體分析
通過記憶體分析可以很直觀的看到,每個陣列的元素一一對應,且都分別指向同一個記憶體地址,當通過其中一個數組的某個元素對被指向地址的數值進行更改時,另一個數組相應的元素也會發生改變。