數(shù)組(array)是相同類(lèi)型變量的集合,可以使用共同的名字引用它。數(shù)組可被定義為任何類(lèi)型,可以是一維或多維。數(shù)組中的一個(gè)特別要素是通過(guò)下標(biāo)來(lái)訪(fǎng)問(wèn)它。數(shù)組提供了一種將有聯(lián)系的信息分組的便利方法。
注意:如果你熟悉C/C++ ,請(qǐng)注意,Java 數(shù)組的工作原理與它們不同。
3.11.1 一維數(shù)組
一維數(shù)組(one-dimensional array )實(shí)質(zhì)上是相同類(lèi)型變量列表。要?jiǎng)?chuàng)建一個(gè)數(shù)組,你必須首先定義數(shù)組變量所需的類(lèi)型。通用的一維數(shù)組的聲明格式是:
type var-name[ ];
其中,type 定義了數(shù)組的基本類(lèi)型?;绢?lèi)型決定了組成數(shù)組的每一個(gè)基本元素的數(shù)據(jù)類(lèi)型。這樣,數(shù)組的基本類(lèi)型決定了數(shù)組存儲(chǔ)的數(shù)據(jù)類(lèi)型。例如,下面的例子定義了數(shù)據(jù)類(lèi)型為int ,名為month_days 的數(shù)組。
int month_days[];
盡管該例子定義了month_days 是一個(gè)數(shù)組變量的事實(shí),但實(shí)際上沒(méi)有數(shù)組變量存在。事實(shí)上,month_days 的值被設(shè)置為空,它代表一個(gè)數(shù)組沒(méi)有值。為了使數(shù)組month_days 成為實(shí)際的、物理上存在的整型數(shù)組,你必須用運(yùn)算符new 來(lái)為其分配地址并且把它賦給month_days 。運(yùn)算符new 是專(zhuān)門(mén)用來(lái)分配內(nèi)存的運(yùn)算符。
你將在后面章節(jié)中更進(jìn)一步了解運(yùn)算符new,但是你現(xiàn)在需要使用它來(lái)為數(shù)組分配內(nèi)存。當(dāng)運(yùn)算符new被應(yīng)用到一維數(shù)組時(shí),它的一般形式如下:
array-var = new type[size];
其中,type 指定被分配的數(shù)據(jù)類(lèi)型,size指定數(shù)組中變量的個(gè)數(shù),array-var 是被鏈接到數(shù)組的數(shù)組變量。也就是,使用運(yùn)算符new 來(lái)分配數(shù)組,你必須指定數(shù)組元素的類(lèi)型和數(shù)組元素的個(gè)數(shù)。用運(yùn)算符new 分配數(shù)組后,數(shù)組中的元素將會(huì)被自動(dòng)初始化為零。下面的例子分配了一個(gè)12個(gè)整型元素的數(shù)組并把它們和數(shù)組month_days 鏈接起來(lái)。
month_days = new int[12];
通過(guò)這個(gè)語(yǔ)句的執(zhí)行,數(shù)組month_days 將會(huì)指向12個(gè)整數(shù),而且數(shù)組中的所有元素將被初始化為零。
讓我們回顧一下上面的過(guò)程:獲得一個(gè)數(shù)組需要2步。第一步,你必須定義變量所需的類(lèi)型。第二步,你必須使用運(yùn)算符new來(lái)為數(shù)組所要存儲(chǔ)的數(shù)據(jù)分配內(nèi)存,并把它們分配給數(shù)組變量。這樣Java 中的數(shù)組被動(dòng)態(tài)地分配。如果動(dòng)態(tài)分配的概念對(duì)你陌生,別擔(dān)心,它將在本書(shū)的后面詳細(xì)討論。
一旦你分配了一個(gè)數(shù)組,你可以在方括號(hào)內(nèi)指定它的下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)組中特定的元素。
所有的數(shù)組下標(biāo)從零開(kāi)始。例如,下面的語(yǔ)句將值28賦給數(shù)組month_days 的第二個(gè)元素。
month_days[1] = 28;
下面的程序顯示存儲(chǔ)在下標(biāo)為3的數(shù)組元素中的值。
System.out.println ( month_days [ 3 ]);
綜上所述,下面程序定義的數(shù)組存儲(chǔ)了每月的天數(shù)。
// Demonstrate a one-dimensional array.
class Array {
public static void main(String args[]) {
int month_days[];
month_days = new int[12];
month_days[0] = 31;
month_days[1] = 28;
month_days[2] = 31;
month_days[3] = 30;
month_days[4] = 31;
month_days[5] = 30;
month_days[6] = 31;
month_days[7] = 31;
month_days[8] = 30;
month_days[9] = 31;
month_days[10] = 30;
month_days[11] = 31;
System.out.println("April has " + month_days[3] + " days.");
}
}
當(dāng)你運(yùn)行這個(gè)程序時(shí),它打印出4月份的天數(shù)。如前面提到的,Java 數(shù)組下標(biāo)從零開(kāi)始,因此4月份的天數(shù)數(shù)組元素為month_days[3] 或30。
將對(duì)數(shù)組變量的聲明和對(duì)數(shù)組本身的分配結(jié)合起來(lái)是可以的,如下所示:
int month_days[] = new int[12];
這將是你通??匆?jiàn)的編寫(xiě)Java 程序的專(zhuān)業(yè)做法。
數(shù)組可以在聲明時(shí)被初始化。這個(gè)過(guò)程和簡(jiǎn)單類(lèi)型初始化的過(guò)程一樣。數(shù)組的初始化(array initializer )就是包括在花括號(hào)之內(nèi)用逗號(hào)分開(kāi)的表達(dá)式的列表。逗號(hào)分開(kāi)了數(shù)組元素的值。Java 會(huì)自動(dòng)地分配一個(gè)足夠大的空間來(lái)保存你指定的初始化元素的個(gè)數(shù),而不必使用運(yùn)算符new。例如,為了存儲(chǔ)每月中的天數(shù),下面的程序定義了一個(gè)初始化的整數(shù)數(shù)組:// An improved version of the previous program.
class AutoArray {
public static void main(String args[]) {
int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31 };
System.out.println("April has " + month_days[3] + " days.");
}
}
當(dāng)你運(yùn)行這個(gè)程序時(shí),你會(huì)看到它和前一個(gè)程序產(chǎn)生的輸出一樣。
Java 嚴(yán)格地檢查以保證你不會(huì)意外地去存儲(chǔ)或引用在數(shù)組范圍以外的值。Java 的運(yùn)行系統(tǒng)會(huì)檢查以確保所有的數(shù)組下標(biāo)都在正確的范圍以?xún)?nèi)(在這方面,Java 與C/C++ 從根本上不同,C/C++ 不提供運(yùn)行邊界檢查)。例如,運(yùn)行系統(tǒng)將檢查數(shù)組month_days 的每個(gè)下標(biāo)的值以保證它包括在0和11之間。如果你企圖訪(fǎng)問(wèn)數(shù)組邊界以外(負(fù)數(shù)或比數(shù)組邊界大)的元素,你將引起運(yùn)行錯(cuò)誤。
下面的例子運(yùn)用一維數(shù)組來(lái)計(jì)算一組數(shù)字的平均數(shù)。
// Average an array of values.
class Average {
public static void main(String args[]) {
double nums[] = {10.1, 11.2, 12.3, 13.4, 14.5};
double result = 0;
int i;
for(i=0; i<5; i++)
result = result + nums[i];
System.out.println("Average is " + result / 5);
}
}
3.11.2 多維數(shù)組
在Java 中,多維數(shù)組(multidimensional arrays )實(shí)際上是數(shù)組的數(shù)組。你可能期望,這些數(shù)組形式上和行動(dòng)上和一般的多維數(shù)組一樣。然而,你將看到,有一些微妙的差別。定義多維數(shù)組變量要將每個(gè)維數(shù)放在它們各自的方括號(hào)中。例如,下面語(yǔ)句定義了一個(gè)名為twoD 的二維數(shù)組變量。
注意:如果你熟悉C/C++ ,請(qǐng)注意,Java 數(shù)組的工作原理與它們不同。
3.11.1 一維數(shù)組
一維數(shù)組(one-dimensional array )實(shí)質(zhì)上是相同類(lèi)型變量列表。要?jiǎng)?chuàng)建一個(gè)數(shù)組,你必須首先定義數(shù)組變量所需的類(lèi)型。通用的一維數(shù)組的聲明格式是:
type var-name[ ];
其中,type 定義了數(shù)組的基本類(lèi)型?;绢?lèi)型決定了組成數(shù)組的每一個(gè)基本元素的數(shù)據(jù)類(lèi)型。這樣,數(shù)組的基本類(lèi)型決定了數(shù)組存儲(chǔ)的數(shù)據(jù)類(lèi)型。例如,下面的例子定義了數(shù)據(jù)類(lèi)型為int ,名為month_days 的數(shù)組。
int month_days[];
盡管該例子定義了month_days 是一個(gè)數(shù)組變量的事實(shí),但實(shí)際上沒(méi)有數(shù)組變量存在。事實(shí)上,month_days 的值被設(shè)置為空,它代表一個(gè)數(shù)組沒(méi)有值。為了使數(shù)組month_days 成為實(shí)際的、物理上存在的整型數(shù)組,你必須用運(yùn)算符new 來(lái)為其分配地址并且把它賦給month_days 。運(yùn)算符new 是專(zhuān)門(mén)用來(lái)分配內(nèi)存的運(yùn)算符。
你將在后面章節(jié)中更進(jìn)一步了解運(yùn)算符new,但是你現(xiàn)在需要使用它來(lái)為數(shù)組分配內(nèi)存。當(dāng)運(yùn)算符new被應(yīng)用到一維數(shù)組時(shí),它的一般形式如下:
array-var = new type[size];
其中,type 指定被分配的數(shù)據(jù)類(lèi)型,size指定數(shù)組中變量的個(gè)數(shù),array-var 是被鏈接到數(shù)組的數(shù)組變量。也就是,使用運(yùn)算符new 來(lái)分配數(shù)組,你必須指定數(shù)組元素的類(lèi)型和數(shù)組元素的個(gè)數(shù)。用運(yùn)算符new 分配數(shù)組后,數(shù)組中的元素將會(huì)被自動(dòng)初始化為零。下面的例子分配了一個(gè)12個(gè)整型元素的數(shù)組并把它們和數(shù)組month_days 鏈接起來(lái)。
month_days = new int[12];
通過(guò)這個(gè)語(yǔ)句的執(zhí)行,數(shù)組month_days 將會(huì)指向12個(gè)整數(shù),而且數(shù)組中的所有元素將被初始化為零。
讓我們回顧一下上面的過(guò)程:獲得一個(gè)數(shù)組需要2步。第一步,你必須定義變量所需的類(lèi)型。第二步,你必須使用運(yùn)算符new來(lái)為數(shù)組所要存儲(chǔ)的數(shù)據(jù)分配內(nèi)存,并把它們分配給數(shù)組變量。這樣Java 中的數(shù)組被動(dòng)態(tài)地分配。如果動(dòng)態(tài)分配的概念對(duì)你陌生,別擔(dān)心,它將在本書(shū)的后面詳細(xì)討論。
一旦你分配了一個(gè)數(shù)組,你可以在方括號(hào)內(nèi)指定它的下標(biāo)來(lái)訪(fǎng)問(wèn)數(shù)組中特定的元素。
所有的數(shù)組下標(biāo)從零開(kāi)始。例如,下面的語(yǔ)句將值28賦給數(shù)組month_days 的第二個(gè)元素。
month_days[1] = 28;
下面的程序顯示存儲(chǔ)在下標(biāo)為3的數(shù)組元素中的值。
System.out.println ( month_days [ 3 ]);
綜上所述,下面程序定義的數(shù)組存儲(chǔ)了每月的天數(shù)。
// Demonstrate a one-dimensional array.
class Array {
public static void main(String args[]) {
int month_days[];
month_days = new int[12];
month_days[0] = 31;
month_days[1] = 28;
month_days[2] = 31;
month_days[3] = 30;
month_days[4] = 31;
month_days[5] = 30;
month_days[6] = 31;
month_days[7] = 31;
month_days[8] = 30;
month_days[9] = 31;
month_days[10] = 30;
month_days[11] = 31;
System.out.println("April has " + month_days[3] + " days.");
}
}
當(dāng)你運(yùn)行這個(gè)程序時(shí),它打印出4月份的天數(shù)。如前面提到的,Java 數(shù)組下標(biāo)從零開(kāi)始,因此4月份的天數(shù)數(shù)組元素為month_days[3] 或30。
將對(duì)數(shù)組變量的聲明和對(duì)數(shù)組本身的分配結(jié)合起來(lái)是可以的,如下所示:
int month_days[] = new int[12];
這將是你通??匆?jiàn)的編寫(xiě)Java 程序的專(zhuān)業(yè)做法。
數(shù)組可以在聲明時(shí)被初始化。這個(gè)過(guò)程和簡(jiǎn)單類(lèi)型初始化的過(guò)程一樣。數(shù)組的初始化(array initializer )就是包括在花括號(hào)之內(nèi)用逗號(hào)分開(kāi)的表達(dá)式的列表。逗號(hào)分開(kāi)了數(shù)組元素的值。Java 會(huì)自動(dòng)地分配一個(gè)足夠大的空間來(lái)保存你指定的初始化元素的個(gè)數(shù),而不必使用運(yùn)算符new。例如,為了存儲(chǔ)每月中的天數(shù),下面的程序定義了一個(gè)初始化的整數(shù)數(shù)組:// An improved version of the previous program.
class AutoArray {
public static void main(String args[]) {
int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31 };
System.out.println("April has " + month_days[3] + " days.");
}
}
當(dāng)你運(yùn)行這個(gè)程序時(shí),你會(huì)看到它和前一個(gè)程序產(chǎn)生的輸出一樣。
Java 嚴(yán)格地檢查以保證你不會(huì)意外地去存儲(chǔ)或引用在數(shù)組范圍以外的值。Java 的運(yùn)行系統(tǒng)會(huì)檢查以確保所有的數(shù)組下標(biāo)都在正確的范圍以?xún)?nèi)(在這方面,Java 與C/C++ 從根本上不同,C/C++ 不提供運(yùn)行邊界檢查)。例如,運(yùn)行系統(tǒng)將檢查數(shù)組month_days 的每個(gè)下標(biāo)的值以保證它包括在0和11之間。如果你企圖訪(fǎng)問(wèn)數(shù)組邊界以外(負(fù)數(shù)或比數(shù)組邊界大)的元素,你將引起運(yùn)行錯(cuò)誤。
下面的例子運(yùn)用一維數(shù)組來(lái)計(jì)算一組數(shù)字的平均數(shù)。
// Average an array of values.
class Average {
public static void main(String args[]) {
double nums[] = {10.1, 11.2, 12.3, 13.4, 14.5};
double result = 0;
int i;
for(i=0; i<5; i++)
result = result + nums[i];
System.out.println("Average is " + result / 5);
}
}
3.11.2 多維數(shù)組
在Java 中,多維數(shù)組(multidimensional arrays )實(shí)際上是數(shù)組的數(shù)組。你可能期望,這些數(shù)組形式上和行動(dòng)上和一般的多維數(shù)組一樣。然而,你將看到,有一些微妙的差別。定義多維數(shù)組變量要將每個(gè)維數(shù)放在它們各自的方括號(hào)中。例如,下面語(yǔ)句定義了一個(gè)名為twoD 的二維數(shù)組變量。