Java 從基礎到精通 — 第 5 講
選擇適合您目的的泛型和集合
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
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。
集合選擇不僅僅是數據數量的問題。 首先必須確定使用目的,例如順序、重複、搜尋關鍵字和更改頻率。