之前介紹的各類變數都是單獨聲明的,倘若要求定義相同類型的一組變數,則需定義許多同類型的變數,顯然耗時耗力且不宜維護。為此,編程語言引入了數組的概念,每個數組都由一組相同類型的數據構成,對外有統一的數組名稱,對內通過序號區分每個數據元素。數組類型由基本的變數類型擴展而來,在基本類型後面加上一對方括弧, ...
之前介紹的各類變數都是單獨聲明的,倘若要求定義相同類型的一組變數,則需定義許多同類型的變數,顯然耗時耗力且不宜維護。為此,編程語言引入了數組的概念,每個數組都由一組相同類型的數據構成,對外有統一的數組名稱,對內通過序號區分每個數據元素。
數組類型由基本的變數類型擴展而來,在基本類型後面加上一對方括弧,便形成了該類型對應的數組類別。在Java代碼中聲明數組變數有兩種形式,一種是在變數名稱後面添加方括弧,例如“int primeNumbers[]”;另一種是在類型後面添加方括弧,例如“int[] primeNumbers”。兩種形式表達的涵義完全一致,都是聲明一個名叫primeNumbers的整型數組,只是書寫習慣上存在區別。
聲明完數組變數,還得給它分配存儲空間。一個數組有多長,包含幾個元素,這需要程式員事先予以指定。分配數組空間的途徑有三種,說明如下:
1、利用語句“new 變數類型[數組長度]”分配空間,比如希望數組primeNumbers能夠容納四個元素,則可通過下麵這行語句實現:
// 在方括弧內填入數字,表示數組有多大 primeNumbers = new int[4];
其中關鍵字new的意思是創建一塊存儲空間,方括弧內部的數字表示該數組的元素個數。
2、在分配存儲空間的時候立即對數組進行初始化賦值,此時方括弧中間不填數字,而在方括弧後面添加花括弧,並且花括弧內部是以逗號分隔的一組數值。此時初始化賦值的代碼如下所示:
// 方括弧內留空,然後緊跟花括弧,花括弧內部是以逗號分隔的一組數值 primeNumbers = new int[]{2, 3, 5, 7};
3、上面的第二種寫法,之所以方括弧內沒填數字,是因為花括弧里已經確定了具體的元素數量。既然程式能夠自動推導元素的數量,那麼從元素值也能推知該元素的變數類型,如此一來花括弧前面的“new int[]”完全是冗餘的,於是就形成了以下的簡化寫法:
// 以下是分配數組空間的第三種形式:賦值等號右邊直接跟著花括弧 primeNumbers = {2, 3, 5, 7};
以上的賦值等號右邊直接跟著花括弧,花括弧裡面有四個整型數字,這便告訴編譯器:該數組需要分配四個元素大小,並且每個元素都是整型數值。
現在數組變數總算占據一塊地盤,根據數組名稱加上元素序號,即可訪問對應位置的數組元素。獲取某個數組元素的格式形如“數組名稱[元素序號]”,譬如primeNumbers[0]表示獲取下標為0的數組元素,Java代碼里的下標0對應日常生活中的第一個,因此primeNumbers[0]指的就是第一個數組元素。這個數組元素的用法跟普通變數一樣,既能對它賦值,也能把它列印出來。若要列印數組內部的所有元素數值,則可通過迴圈語句實現,通過“數組名稱.length”獲取該數組的長度,然後依次列印長度範圍之內的所有元素。下麵是聲明一個整型數組,並對每個數組元素賦值,最後遍歷列印各元素的完整代碼例子:
// 以下是聲明數組的第一種形式:“變數類型 數組名稱[]” int primeNumbers[]; // 以下是分配數組空間的第一種形式 // 在方括弧內填入數字,表示數組有多大 primeNumbers = new int[4]; // 數組名稱後面的“[數字]”,就是數組元素的下標,表示當前操作的是第幾個數組元素 primeNumbers[0] = 2; // 給下標為0的數組元素賦值,下標0對應日常生活中的第一個 primeNumbers[1] = 3; // 給下標為1的數組元素賦值,下標0對應日常生活中的第二個 primeNumbers[2] = 5; // 給下標為2的數組元素賦值,下標0對應日常生活中的第三個 primeNumbers[3] = 7; // 給下標為3的數組元素賦值,下標0對應日常生活中的第四個 // 下麵通過迴圈語句依次讀出數組中的所有元素 // “數組名稱.length”表示獲取該數組的長度(數組大小) for (int i=0; i<primeNumbers.length; i++) { // 列印下標為i的數組元素 System.out.println("prime number = "+primeNumbers[i]); }
數組的一個應用方向為數學上的數列運算,比如常見的斐波那契數列。話說數學家斐波那契養了一對兔子,他發現兔子出生兩個月後就有繁殖能力,並且一對兔子每個月能生產一對小兔子,那麼一年過後,總共有多少對兔子?這個兔子問題看起來得一個月一個月去數,第一個月只有一對小兔子;第二個月小兔子長成大兔子,但總共仍是一對兔子;第三個月大兔子生下一對小兔子,加起來有兩對兔子;第四個月大兔子又生下一對新的小兔子,上個月的小兔子長成大兔子,這下共有三對兔子……這麼一路數到第十二個月,把每個月的兔子數量情況整理為下麵的一張表格。
上表所示的每月兔子對數就構成了斐波那契數列,它的前12個數字依次為:1、1、2、3、5、8、13、21、34、55、89、144。仔細觀察發現該數列有個規律,從第三個數字開始,每個數字都是前兩個數字之和,如3=2+1、5=3+2、8=5+3等等。於是大可不必絞盡腦汁去計算每個月的兔子生育情況,完全可以把這項工作交給電腦程式,讓Java代碼幫助我們求解斐波那契數列。為此先聲明一個大小為12的整型數組,接著迴圈遍歷該數組,依次填入每個元素的數值。按照上述思路編寫的程式代碼示例如下:
// 聲明一個兔子數量(多少對)的數組變數 int rabbitNumbers[]; // 一年有12個月,故兔子數組大小為12 rabbitNumbers = new int[12]; // 迴圈計算兔子數組在每個月的兔子對數 for (int i=0; i<rabbitNumbers.length; i++) { if (i < 2) { // 數列的頭兩個元素都是1 rabbitNumbers[i] = 1; } else { // 從第三個元素開始,每個元素都等於它的前面兩個元素之和 rabbitNumbers[i] = rabbitNumbers[i-2] + rabbitNumbers[i-1]; } int month = i+1; // 列印當前的月份和兔子對數 System.out.println("第"+month+"個月,兔子對數="+rabbitNumbers[i]); }
最後運行這段整型數組的運算代碼,得到下列的日誌記錄,從中可見斐波那契數列的前12個數字。
第1個月,兔子對數=1 第2個月,兔子對數=1 第3個月,兔子對數=2 第4個月,兔子對數=3 第5個月,兔子對數=5 第6個月,兔子對數=8 第7個月,兔子對數=13 第8個月,兔子對數=21 第9個月,兔子對數=34 第10個月,兔子對數=55 第11個月,兔子對數=89 第12個月,兔子對數=144