HOWTO · Java

在 Java 中從 ArrayList 中獲取最後一個元素

這篇文章是關於從 Java 中的 ArrayList 獲取最後一個元素。

本頁內容

若要取得 Java ArrayList 的最後一個元素,請讀取 list.get(list.size() - 1)。Java 使用從 0 開始的索引,因此最後一個有效索引比清單大小少 1。與 Python 清單不同,Java 清單不支援以 -1 這類負索引取得最後一個元素。

使用 size() 和 get() 取得最後一個元素

呼叫 size() 查詢清單包含多少個元素,減去 1 算出最後一個索引,再將該索引傳給 get()。例如,含有四個元素的清單,其有效索引為 0 到 3,因此最後一個元素位於索引 4 - 1。

請執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import java.util.ArrayList;

public class LastElement {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);

        int last = numbers.get(numbers.size() - 1);
        System.out.println(last);
    }
}
40

這種直接查詢通常適合用來取得 ArrayList 的最後一個元素。它不需要使用串流、複製子清單,或轉換成其他集合。

處理空的 ArrayList

空清單的大小為 0,因此 size() - 1 會得到 -1。將該索引傳給 get() 會擲出 IndexOutOfBoundsException。存取元素前先檢查清單,並選擇符合呼叫端需求的處理方式。

若方法以 null 表示「沒有元素」,請明確說明這項契約。以下輔助方法也會拒絕 null 清單,而不會將它視為空清單。清單為空時,範例會顯示英文標籤「No elements」。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import java.util.ArrayList;

public class LastElement {
    static <T> T lastOrNull(ArrayList<T> list) {
        if (list == null) {
            throw new IllegalArgumentException("list must not be null");
        }
        return list.isEmpty() ? null : list.get(list.size() - 1);
    }

    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        String last = lastOrNull(names);
        System.out.println(last == null ? "No elements" : last);
    }
}
No elements

回傳 null 很簡單,但呼叫端必須區分「沒有元素」與清單中合法的 null 值。如果這項區分很重要,可以改為回傳 Optional<T>,或讓呼叫端在呼叫 get() 前處理空清單。不要用捕捉 IndexOutOfBoundsException 來取代對空輸入的明確處理。

為反覆存取兩端選擇合適的集合

若只查詢一次,將 ArrayList 轉換為 ArrayDeque 或 LinkedList,只會增加記憶體配置並複製元素,對原清單沒有幫助。保留 ArrayList,使用它的最後一個索引即可。

如果程式會反覆在兩端新增和移除元素,應從一開始就依照這種存取模式選擇雙端佇列。ArrayDeque 提供 addLast() 和 getLast() 等端點操作;LinkedList 也提供 getLast(),但儲存方式和記憶體特性不同。這些型別適合在設計集合時列入考量,不是為了單次讀取而採用的捷徑。ArrayDeque 不允許 null 元素;如果資料模型包含 null 值,請將這項限制納入考量。

使用 Guava 的 Iterables.getLast()

如果專案已經依賴 Guava,Iterables.getLast(iterable) 可作為處理 Iterable 的選擇之一。Guava 官方 API 文件中的 Iterables.getLast() 說明了兩種多載:單一參數的方法在 iterable 為空時會擲出 NoSuchElementException;Iterables.getLast(iterable, defaultValue) 則會在沒有元素時回傳指定的預設值。

此做法需要將 Guava 加入專案的 classpath;它並非 Java 標準函式庫的一部分。若使用 ArrayList 的專案沒有其他使用 Guava 的需求,使用 size() 和 get() 即可避免額外依賴。

總結

若要取得非空 ArrayList 的最後一個元素,請使用 list.get(list.size() - 1)。先檢查清單是否為空,並明確決定沒有元素時的處理方式,因為空清單會產生索引 -1,而 get() 會擲出 IndexOutOfBoundsException。只讀取一次時,不必為此轉換清單;只有當整體操作模式需要反覆存取兩端時,才考慮使用 ArrayDeque 或其他集合。如果專案本來就適合使用 Guava,也可以採用 Iterables.getLast()。