From Gossip@Openhome

Java Gossip: 一維陣列物件

您現在要整理全班的程式設計小考成績,您希望寫個小程式,全班共有40名學生,所以您必須有40個變數來儲存學生的成績,現在問題來了,根據之前學過的,難道您要宣告40個名稱不同的變數來儲存學生的成績資料嗎?

當然您知道不會這麼麻煩的,Java提供「陣列」(Array)讓您可以宣告一個以「索引」(Index)作為識別的資料結構,在Java中可以這麼宣告一個陣列並初始陣列內容:
int[] score = {90, 85, 55, 94, 77};

上面這個程式片段宣告了一個score陣列,它的內容包括90、85、55、94與77這五個元素,我們要存取陣列時,必須使用索引來指定存取陣列中的哪個元素,在Java中,陣列的索引是由0開始,也就是說索引0的位置儲存90、索引1的位置儲存85、索引2的位置儲存55,依此類推。

下面這個程式可以讓您使用for迴圈來取出陣列中的元素值:

  • ScoreArray.java
public class ScoreArray { 
public static void main(String[] args) {
int[] score = {90, 85, 55, 94, 77};

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

執行結果:
90 85 55 94 77 

在存取陣列元素時,必須注意到所指定的索引值不可超出陣列範圍,例如在上例中,我們不可以存取超過4的索引值,否則會發生ArrayIndexOutOfBoundsException例外。

在這個程式中,您使用了length這個屬性成員,這邊涉及到一個觀念,在Java中,陣列是一個物件,而不是單純的資料集合,當您宣告一個陣列時,其實就是在配置一個陣列物件,上面的程式只是陣列宣告與初始化成員的一個簡易宣告方式,陣列物件的length屬性成員可以取回這個陣列的長度,也就是元素個數。

其實在Java中,物件都是以new來配置記憶體空間,陣列的使用也不例外,一個完整的陣列宣告方式如下所示:
int[] arr = new int[10];


在上面的宣告中,會為arr配置10個整數的陣列元素,索引為0到9,初始值預設為0,在Java中配置陣列之後,若還沒有指定初值,則依資料型態的不同,會預設有不同的初值,如下所示:

資料型態 初值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
boolean false

下面這個程式使用配置的語法來宣告陣列,並使用迴圈來設定其值及顯示:

  • BasicArray.java
public class BasicArray { 
public static void main(String[] args) {
int[] arr = new int[10];

System.out.print("Array值: ");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
arr[i] = i;
}

System.out.print("\n\nArray值: ");
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
}

執行結果:
Array值: 0 0 0 0 0 0 0 0 0 0

Array值: 0 1 2 3 4 5 6 7 8 9


由於陣列的記憶體空間是使用new配置而來,這意味著您也可以使用動態的方式來宣告陣列長度,而不用在程式中事先決定陣列大小,例如:
  • CustomArrayLength.java
import java.util.Scanner;

public class CustomArrayLength {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.print("請輸入Array大小: ");

int length = scanner.nextInt();
int[] arr = new int[length]; // 動態配置長度

System.out.println("Array長度: " + arr.length);
System.out.print("內容: ");
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
}

執行結果:
請輸入Array大小: 20
Array長度: 20
內容: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


在上面的程式中,您先宣告一個陣列名稱arr,使用int[] arr表示這個名稱將參考至一個一維陣列物件,您也可以使用int[] arr,這兩種宣告方式都是可以接受的,在使用者輸入指定長度後,您使用這個長度來配置陣列物件,並將這個陣列物件指定給arr來參考。

陣列的索引值由0開始並不是沒有原因的,事實上索引值表示所指定的陣列元素相對於陣列第一個元素記憶體位置的位移量(Offset),位移量為0,自然就是指第一個元素,而索引9就是指相對於第一個元素的位移量為9。在Java中您不直接處理關於記憶體位址的操作,以上的觀念是讓您更瞭解一些陣列索引的運作原理。