← SEARCHABLE ARCHIVE
Java · 2026-07-30

Java 從基礎到精通 — 第 5 講

選擇適合您目的的泛型和集合

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

Java集合儲存各種數據,但每種資料結構做不同的事情。 如果一起使用泛型,則可以在編譯時檢查類型錯誤,而不必每次都轉換檢索到的值。

List, Set, Map

List<String> party = new ArrayList<>();
Set<Integer> unlockedIds = new HashSet<>();
Map<Integer, Item> itemById = new HashMap<>();

party.add("Rose");
unlockedIds.add(10);
itemById.put(10, new Item(10, "Potion"));

List 允許排序和重複,而 Set 處理非重複值的存在或不存在。 Map透過鍵來找出值。

HashMap的順序不保證。 如果排序或輸入順序是一個合同,您應該選擇適合該目的的實作。

安全搜尋

Item item = itemById.get(10);
if (item != null) {
    System.out.println(item.getName());
}

如果鍵不存在,則 get 傳回 null。 避免將 null 本身儲存為值的設計可以防止 None 和 null 值之間的混淆。

泛型類別

public final class Registry<T extends Identifiable> {
    private final Map<Integer, T> values = new HashMap<>();

    public void add(T value) {
        values.put(value.getId(), value);
    }

    public Optional<T> find(int id) {
        return Optional.ofNullable(values.get(id));
    }
}

T extends Identifiable 是一個限制,即要儲存的類型必須提供 ID。 Registry<Item> 和 Registry<Monster> 重複使用相同的規則,但數值不混合。

依賴介面而不是實現

如果將欄位和參數類型設為List或Map接口,則合約中僅保留必要的操作。 但是,如果效能特性很重要,您還應該知道實際實作是 ArrayList 還是 LinkedList。

集合選擇不僅僅是數據數量的問題。 首先必須確定使用目的,例如順序、重複、搜尋關鍵字和更改頻率。