我想應該是沒有一個工程師會不知道陣列是甚麼吧,陣列(Array)是最基本的資料結構之一,所有的程式語言都會有這個資料型態,它可以儲存一堆相同類型的資料,並且作為後端工程師的日常工作,便是對於資料的查詢、篩選、排列等操作,也因此學會並活用陣列相關的演算法是絕對必要的。
在Arrays 101 這個Explore 卡片中,它介紹了一些有關陣列的操作,每一個段落還會出個幾題Easy 的題目,整個寫完花不到兩天的時間,這篇就紀錄一下它的內容,接下來幾篇再來講解它出的題目。
有關陣列的介紹,Arrays 101 使用了DVD 作為舉例,但現在人可能不知道什麼是DVD,我這邊想了幾個例子,你可能有很多衣服,通常會整理起來放在衣櫃裡面,你也可能有很多雙鞋子,通常會放在鞋櫃裡面,像這樣把相同的東西(衣服、鞋子)放進一個有限的空間(衣櫃、鞋櫃)裡,這個概念對應到軟體的世界裡就是陣列(Array)。
An Array is a collection of items. The items could be integers, strings, DVDs, games, books—anything really. The items are stored in neighboring (contiguous) memory locations. Because they're stored together, checking through the entire collection of items is straightforward.
陣列就是某一個項目的集合,這個項目可以是int、string 或是其他物件,這些項目會儲存在相鄰的記憶體位置中,也因為它們儲存再一起,查找起來比較方便快速。
每個語言創建陣列的方法應該都不太一樣,這邊使用Java 當作範例。
第一種方法是只有建立並指定大小,其內容都是那個類型的預設值,像int 預設值是0,String 預設值是null。
// 建立一個int 陣列,並指定大小為5
int[] intArray = new int[5];
// 建立一個String 陣列,並指定大小為3
String[] stringArray = new String[3];
以記憶體的角度來看的話大概會像下圖一樣,五個相鄰的記憶體位置,每個位置都是陣列類型的預設值。
第二種方法是建立並指定陣列元素的值,這個方法不用指定陣列大小,會自動根據元素的數量決定。
// 建立一個int 陣列,並指定元素為1, 2, 3, 4, 5
int[] intArray = {1, 2, 3, 4, 5};
int[] intArray = new int[] {1, 2, 3, 4, 5};
到這邊應該沒啥問題,但需要複習的重點是陣列的大小,創建之後就沒辦法改變,如果需要放進更多的元素就要創建新的陣列;就像你買了一個可以放10雙鞋子的鞋櫃,沒辦法放進第11雙,如果想要放更多鞋子的話就要再買一個更大的鞋櫃,相對的,如果你只有5雙鞋子但買了太大的鞋櫃,這也會造成空間的浪費;因此,在建立一個陣列之前,必須要謹慎考慮它的大小。
不過在軟體的世界中也不是這麼一板一眼,如果還不確定會有多少元素,可以使用ArrayList 或其他集合類型,在初始化時只要決定資料類型,而不用指定大小,只是需要犧牲存取速度,這就看應用場景去取捨了。
The two most primitive Array operations are writing elements into them, and reading elements from them. All other Array operations are built on top of these two primitive operations.
這個段落就比較簡單,對陣列的操作最基本的就是寫入和查詢,只要指定陣列的索引就可以做到了,但要記得陣列的索引從0開始算,最後一個索引值是N-1(N是陣列初始化的大小)。
int[] intArray = new int[5];
// 指定第一個元素是1
intArray[0] = 1;
// 指定第三個元素是3
intArray[2] = 3;
// 取得第三個元素,這邊會顯示3
System.out.println(intArray[2]);
// 讀寫都可以使用迴圈操作
for (int i = 0; i < 5; i++) {
intArray[i] = i;
}
for (int item: intArray) {
System.out.println(item);
}
如果單看程式很難懂的話,這邊再畫個圖示意一下,索引值是index,元素值是item。
陣列容量指的是這個陣列最多可以儲存多少元素;而陣列長度指的是這個陣列目前儲存了多少元素。
有關陣列的容量和長度我之前是沒有去特別記差別,只記得使用陣列的時候不要超過它的length,使用ArrayList 的時候不要超過它的size(),但這邊有提到就記錄一下。
到這邊第一個小節就結束了,這邊有出了幾道題目但都蠻簡單的,先列出來有興趣的話可以做做看。
本來是想要一篇寫完整個Arrays 101 的內容,但突然發現文章有點太長了,太長的文章對於現代人的專注力是一大考驗阿...所以打算把內容拆分成三篇文章紀錄,然後題目講解再分成幾篇,這樣可以水個好幾篇文章。