一維陣列拷貝的方式:for迴圈
阿新 • • 發佈:2019-02-06
說到陣列拷貝,先看看淺拷貝與深拷貝的概念。
概括起來講,淺拷貝就是指兩個物件公用一個值,一個的改變了另一個也會隨之改變,深拷貝則是兩個物件雖然值相等,但是相互獨立互不影響。
第一種一維陣列的拷貝方式: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迴圈語句是淺拷貝。
看一下記憶體分析:
通過記憶體分析可以很直觀的看到,每個陣列的元素一一對應,且都分別指向同一個記憶體地址,當通過其中一個數組的某個元素對被指向地址的數值進行更改時,另一個數組相應的元素也會發生改變。