CodeGym /課程 /JAVA 25 SELF /「無限陣列」 — ArrayList<T>

「無限陣列」 — ArrayList<T>

JAVA 25 SELF
等級 12 , 課堂 1
開放

1. 前言

這是額外等級的第一堂課。我們已經相當接近面向物件程式設計(OOP)的學習了。我想先勾起你的興趣,並稍微提前預告一下 😈。在本等級中,我會告訴你 5 件有趣的事:

  1. ♾️ 你將學會建立無限陣列
  2. 📖 接著維護「個人字典」
  3. 💾 然後我會稍微帶你接觸檔案操作
  4. 🌐 之後我們會學習如何從網路下載圖片
  5. 🛰️ 而在本等級最後一堂課,你將即時追蹤國際太空站(ISS)

底層如何運作,你會在之後的等級中學到;今天你只需要學會使用我提供的工具。被勾起好奇心了嗎?那我們開始吧 😇。

回顧一般陣列

先來回顧一下 Java 的一般陣列:

int[] arr = new int[10];

這東西很棒,但也有幾個限制:大小固定;若不建立新陣列,就不能新增或移除元素。然而有時我們想要的是能隨需求成長或縮小的陣列。我們有很棒的解法 — 動態陣列 ArrayList

ArrayList 是一種「聰明的陣列」,能自動成長與縮小。與一般陣列大小固定不同,ArrayList 會自行確保有足夠空間容納新元素。

建立無限陣列

要建立我們的 ArrayList,可以寫下這樣的程式碼:

ArrayList<String> array = new ArrayList<String>()

之後就能往裡面加入元素:

array.add("瑪莎");
array.add("卡佳");

為整數建立動態陣列

如你所料,我們需要在尖括號中指定動態陣列的元素型別。可以指定任何型別,但不包含原始型別。原始型別要改用其包裝型別。

範例:

ArrayList<Integer> numbers = new ArrayList<Integer>();      // int
ArrayList<Double> fees = new ArrayList<Double>();            // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>();       // boolean
ArrayList<Character> chars = new ArrayList<Character>();     // char

我們的 ArrayList 不支援透過 [index] 來存取元素,但它有一組方法,足以涵蓋你的所有需求。讓我們逐一看看最常用的。

2. 方法 add(element) — 新增元素

我們對清單做的第一件事,就是把資料加進去。這就是 add 方法的用途。它會把元素放到清單尾端。

ArrayList<String> todo = new ArrayList<>(); // 待辦清單
todo.add("學習 ArrayList");
todo.add("泡茶");
todo.add("散步");

執行完這三行後,我們有一個包含三個字串的清單。與陣列不同,我們不必事先指定大小 — 它會隨著新增自動成長。

非常方便:你可以從空清單開始,並依使用者操作或程式輸入逐步填充。

3. 方法 get(index) — 依索引存取

清單中的每個元素都有自己的序號 — 索引。索引永遠從 0 開始。也就是說,第一個元素的編號是 0,第二個是 1,依此類推。

若要依編號取得元素,就使用 get 方法。

String task = todo.get(1);
System.out.println("第二件事:" + task);

輸出:

第二件事:泡茶

務必記住:如果取用不存在的索引(例如清單只有三個元素卻呼叫 todo.get(10)),程式會丟出 IndexOutOfBoundsException。因此要嘛確定索引有效,要嘛先用 size() 檢查清單大小。

4. 方法 set(index, element) — 取代元素

有時你需要取代清單中的元素。這種情況不必刪除再新增 — 直接使用 set 方法即可。

todo.set(1, "煮咖啡"); 
System.out.println("現在第二件事:" + todo.get(1));

輸出:

現在第二件事:煮咖啡

因此,set 是一種「即時」更新清單的方式。

5. 方法 remove(index) — 刪除元素

可以依索引從 ArrayList 刪除元素。

todo.remove(0); 
System.out.println("現在的第一件事:" + todo.get(0));

輸出:

現在的第一件事:煮咖啡

我們刪除了第一個元素(索引 0)。現在原本的第二個變成第一個,原本的第三個變成第二個。重點:刪除後清單元素會位移

這點有時會讓新手意外。請務必記得,刪除後索引會重新計算。

6. 方法 size() — 取得清單大小

size 方法會回傳清單中的元素數量。這和陣列的 length 屬性很像,但在 ArrayList 中它是方法。

System.out.println("總數:" + todo.size());

輸出:

總數:2

size 常用於迴圈,以遍歷所有元素:

for (int i = 0; i < todo.size(); i++) 
{
    System.out.println(todo.get(i));
}

7. 方法 contains(element) — 檢查是否存在

若要知道清單中是否有某個元素,可以使用 contains。此方法會回傳 truefalse

System.out.println(todo.contains("散步"));
System.out.println(todo.contains("泡茶"));

輸出:

true
false

當你想避免重複或檢查「清單中是否存在某元素」時,這個方法非常實用。

8. 遍歷元素

有兩種方式可以走訪清單。

索引式迴圈

當你需要元素的編號時,使用這種方式。

for (int i = 0; i < todo.size(); i++) 
{
    System.out.println(i + ": " + todo.get(i));
}

for-each 迴圈

如果不需要編號,只想看所有元素 — 使用 for-each 迴圈。

for (String task : todo) 
{
    System.out.println("事項:" + task);
}

這種寫法更短、也更易讀。

9. 實作:在你的應用程式中使用 ArrayList

我們做一個可新增並輸出的待辦清單:

import java.util.ArrayList;
import java.util.Scanner;

public class TodoApp 
{
    public static void main(String[] args) 
    {
        ArrayList<String> todo = new ArrayList<>();
        Scanner console = new Scanner(System.in);

        while (true) 
        {
            System.out.print("請輸入事項(或輸入空白行以退出):");
            String task = console.nextLine();
            if (task.isEmpty()) break;
            todo.add(task);
        }

        System.out.println("您的待辦清單:");
        for (int i = 0; i < todo.size(); i++) 
        {
            System.out.println((i + 1) + ". " + todo.get(i));
        }
    }
}

希望你喜歡這個無限陣列。它是你認識的第一個 Java 集合。我想你也會喜歡其餘的集合。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION