還記得第一次使用VB.NET寫陣列時,發生了一件令我百思不解的問題,就是當我將某一變數指定某一物件後,使用該變數更改內容,原本物件的內容也會被一併更改...

【使用陣列來舉例】

提一下陣列的宣告:
1. int[] arr; 沒指定大小,沒指定初值。
2. int[] arr = new int[10]; 指定大小,沒指定初值。
3. int[] arr = {1,2,3,4,5}; 指定大小,指定初值。

int[] arr;
在這個宣告中,arr表示一個可以參考至一維陣列物件的名稱,但是目前還沒有指定它參考至任何的物件,在Java中,=運算子用於基本資料型態時,是將值複製給變數,但當它用於物件時,則是將物件指定給參考名稱來參考,您也可以將同一個物件指定給兩個參考名稱,當物件的值藉由其中一個參考名稱變更時,另一個參考名稱所參考到的值也會更動,使用下面的程式來作示範:

public class AdvancedArray { 
    public static void main(String[] args) { 
        int[] arr1 = {1, 2, 3, 4, 5}; 
        int[] tmp1; 
        int[] tmp2; 
 
        tmp1 = arr1; 
        tmp2 = arr1; 
 
        tmp1[2] = 9; //只修改tmp1[2]的值
 
        for(int i = 0; i < tmp1.length; i++) 
            System.out.print("tmp1=" + tmp1[i] + " "); 
        System.out.println(); 
 
        for(int i = 0; i < tmp2.length; i++) 
            System.out.print("tmp2=" + tmp2[i] + " "); 
        System.out.println();
    } 
 }

執行結果:
tmp1=1 2 9 4 5
tmp2=1 2 9 4 5

在這個範例中,藉由tmp1名稱改變了索引2的元素值,所以tmp2所參考到的索引2的元素值也會改變,事實上在這個程式中,有三個參考名稱參考至同一個陣列物件,也就是arr1、tmp1與tmp2,所以arr1索引2的值在程式執行後所參考到的值也改變了。

Q: 那當我們要複製陣列怎麼辦呢??
A: 可以使用for迴圈巡覽複製。
for(int i = 0; i < arr1.length; i++) 
    arr2[i] = arr1[i];

在Java可使用 System類別 所提供的 靜態方法arraycopy()
語法如下:
System.arraycopy(來源, 起始索引, 目的, 起始索引, 複製長度);
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

在JDK 6中,Arrays類別 新增了copyOf()方法:
int[] arr1 = {1, 2, 3, 4, 5}; 
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
Arrays的copyOf()方法傳回的陣列是新的陣列物件,所以您改變傳回陣列中的元素值,也不會影響原來的陣列。
copyOf()的第二個引數指定要建立的新陣列長度,如果新陣列的長度超過原陣列的長度,則保留陣列預設值,例如:
int[] arr1 = {1, 2, 3, 4, 5}; 
int[] arr2 = Arrays.copyOf(arr1, 10);
則arr2的內容會是{1, 2, 3, 4, 5, 0, 0, 0, 0, 0}

arrow
arrow
    全站熱搜

    伊 發表在 痞客邦 留言(0) 人氣()