陣列
介紹Java如何宣告、使用陣列,以及記憶體中的配置。
什麼是陣列? What is Array?
陣列是一種由相同型態的資料組成的資料結構。
陣列在記憶體中使用連續的記憶體空間,透過索引值(index)來做資料的存取。
陣列在Java裡是以物件(object)的方式存在,所以陣列本身是參考資料型態(reference type)。
陣列中的元素可以是基本資料型態(primitive type)也可以是參考資料型態(reference type)。
陣列的創建 Array Creation
陣列就跟一般的物件一樣,需要透過關鍵字new來創造實體,new後面要有: 1. 元素的資料型態 2. 元素個數
陣列被初始化後,每個元素都會被初始化為該型態的初始值(default value)。
假設我們需要一個大小為3的int陣列,範例程式:
int[] array; // 宣告
array = new int[3]; // 創建大小為3的int陣列,回傳reference給array當然也可以寫成一行,這是等價的:
int[] array = new int[3];記憶體配置:

存取元素 Access Elements
透過陣列名稱,利用中括號『[ ]』,括號裡面放元素在陣列中的索引值(index)。
陣列索引值從0開始,只能為非負整數。
以上圖為例:
執行結果:
初始化時給值 Array Initializer
陣列可以同時宣告及指定其值,利用大括號『{ }』,搭配逗號『,』隔開各元素。
編譯器會看大括號理的元素個數及元素值去創造相符的物件,回傳reference給變數array。
這行的效果跟下面相同:
這種寫法適用於在寫程式的時候已經確定該陣列的元素個數、內容。
多維陣列 Multi-Dimensional Array
上面已經討論過一維陣列的宣告及使用,但實務上我們遭遇很多問題並不是單靠一維陣列就可以簡單解決的,因此我們希望可以有一個多維度的陣列來幫我們做處理。
假設我們需要一個大小為2*3二維的int陣列,範例如下:
int[ ][ ]是matrix的型態,代表是int的二為陣列,要幾個維度就用幾個『[ ] 』。
new int[2][3],創造『大小為2個陣列』,其元素內容為『大小為3的int陣列』。
記憶體配置:

有沒有發現到,Java根本沒有所謂的多維陣列!它只是不斷的在一維陣列中塞另一個陣列!
一個m*n的二維陣列,就是m個『大小為n的陣列』,更多維度一樣的概念以此類推,這裡只舉二維為例。(不然實在不好畫)
初始化的方法跟一維陣列相同,可以直接寫成程式碼:
大括號夾起來的就是一個陣列,彼此用逗號『,』隔開,形成陣列中有陣列的樣子。
上述程式效果同於:
也因為Java的陣列是這種特性,所以我們也可以創造出『長度不同』的多維陣列。
假設要創造出的陣列長這樣:

對Java來說,由於陣列在記憶體中都是一維的,不同長度只是指向不同的物件,所以可以輕鬆的初始化。
利用 Initializer :
這樣就可以達成要求了!
要一步一步寫的話像這樣:
參考型態陣列 Reference Type Array
前面舉的例子是int陣列,而我們知道int是基本資料型態,那如果要創件的是參考資料型態的陣列呢?
恩,就跟創造多維陣列一樣,層層的初始化每個物件。
假設我要創造大小為3的Human陣列: (Human為自訂類別)
以上程式可以搭配迴圈使用,是一般常見的做法:
記憶體配置:

一個最大觀念是,Java的陣列是物件,且都是為一維的陣列。內容可以放值(value)或參考(reference),因此可以陣列的內容是另一個陣列,創造出多維陣列的感覺。
記憶體的配置圖在陣列的觀念裡面很重要,一定要懂為什麼。如果有什麼不清楚的麻煩讓我知道,或許是文字或圖片沒弄好產生誤解或混淆。
陣列長度 length of Array
陣列被創造出來,元素個數就決定好了,很多時候我們需要陣列的大小(length)方便我們做運算、處理,那要如何取得呢?
恩,陣列是一個物件,它有一個資料成員用來紀錄它的大小,就叫做 length。
執行結果:
利用 陣列名稱.length 可以輕鬆取得該陣列的長度,搭配迴圈可以方便的走訪整個陣列:
執行結果:
好用方法 useful Method
簡單介紹幾個常用的方法,很多陣列相關方法都定義在Arrays裡,Arrays放在java.util套件中,使用前別忘了import:
快速印出所有元素 Arrays.toString(Object[])
利用這個方法,可以快速的印出陣列中的所有元素,方便自己debug或展示。
執行結果:
複製陣列 .clone()
可以快速的複製一個一模一樣的資料的陣列物件,與原陣列佔用不同記憶體,彼此獨立。
執行結果:
填滿陣列元素 Arrays.fill(Object[],value)
可以把陣列全部用value填滿,常用於陣列初始化。
執行結果:
陣列排序 Arrays.sort(Object[]);
這個方法超美妙的,可以把陣列從小排到大,內部實做是快速排序法(quick sort),時間複雜度 O(NlogN),比較的機制是該物件的 .compareTo()方法,實做上可以省掉很多寫排序演算法的時間。
執行結果:
陣列搜尋 Arrays.binarySearch(Object[],key)
利用binarySearch搜尋陣列中目標key的索引值,時間複雜度為O(logN),如果找不到回傳小於0的整數。因為是用binarySearch實做,所以陣列『必須已排序好(遞增)』。
執行結果:
陣列相等 Arrays.equals(Object[],Object[])
測試兩陣列是否相等,回傳布林值(true or false)。
相等的條件:每個陣列元素的值、順序都完全一樣,若 reference 指到同一物件視為相等,都為 null 也視為相等。
執行結果:
其他詳細方法請參考 document。
Last updated
Was this helpful?