From Gossip@Openhome

Java Gossip: 進階的陣列觀念

藉由對陣列物件的進一步探討,您可以稍微瞭解Java對物件處理的一些作法,首先來看看一個一維陣列參考名稱的宣告:
int[] arr;

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

  • AdvancedArray.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;
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
System.out.println();

for(int i = 0; i < tmp2.length; i++)
System.out.print(tmp2[i] + " ");
System.out.println();

tmp1[2] = 9;
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
System.out.println();

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

執行結果:
1 2 3 4 5
1 2 3 4 5
1 2 9 4 5
1 2 9 4 5 


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

在宣告int[] arr之後,arr表示它是一個一維陣列物件的參考名稱,所以它可以參考至任何長度的一維陣列物件,使用下面這個例子來說明:

  • AdvancedArray.java
public class AdvancedArray { 
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = {5, 6, 7};
int[] tmp;

tmp = arr1;
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
System.out.println();

tmp = arr2;
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
System.out.println();
}
}

執行結果:
1 2 3 4 5
5 6 7


在上面的程式中,tmp可以參考至5個元素的一維陣列,也可以參考至3個元素的一維陣列。

您瞭解到在Java中陣列是一個物件,而使用 = 指定時是將物件指定給陣列名稱來參考,而不是陣列複製,如果您想將整個陣列的值複製給另一個陣列該如何作呢?您可以使用迴圈,將整個陣列的元素值走訪一遍,並指定給另一個陣列相對應的索引位置,例如下面這個例子:

  • AdvancedArray.java
public class AdvancedArray { 
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[5];

for(int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i];

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

執行結果:
1 2 3 4 5

另一個更簡便的方法是使用System類別所提供的靜態方法arraycopy(),其語法如下:
System.arraycopy(來源, 起始索引, 目的, 起始索引, 複製長度);

下面這個程式是個示範:

  • AdvancedArray.java
 
public class AdvancedArray {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[5];

System.arraycopy(arr1, 0, arr2, 0, arr1.length);

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


執行結果:
1 2 3 4 5