基礎程式設計(Java)· CH16

泛型集合

List、Set、Map 一次到位 · 導覽地圖

完整內容看 PDF 講義,三族對照與試跑看 index。

為什麼要集合框架

先挑「行為」,再挑類別

要順序+重複+索引
→ List
要自動去重
→ Set
要用鍵查值
→ Map

全在 java.util;都用泛型 <E> / <K,V> 標元素型別。

只裝物件

型別包裝+自動裝箱

ArrayList<Integer> nums = new ArrayList<>();
nums.add(5);          // 自動裝箱:int → Integer
int x = nums.get(0);  // 自動拆箱:Integer → int

泛型寫包裝類別(Integer),不能寫 ArrayList<int>。裝箱拆箱編譯器自動補。

List 一

ArrayList:有序、可重複

Amy[0] Ben[1] Amy[2]
List<String> li = new ArrayList<>();
li.add("Amy"); li.get(0); li.size(); li.remove("Ben");

用介面型別 List 宣告;個數用 size()(方法、有括號)不是 length。

List 二

ArrayList vs LinkedList

ArrayList
連續陣列
get(i) 快
中間增刪慢
LinkedList
節點鏈
頭尾增刪快
get(i) 慢

多數情況用 ArrayList;頻繁頭尾增刪才考慮 LinkedList。兩者 API(add/get/size)相同。

走訪

增強 for 與 Iterator

for (String n : li) System.out.println(n);   // 增強 for(只讀)

Iterator<String> it = li.iterator();
while (it.hasNext()) {
    String n = it.next();
    if (n.equals("Amy")) it.remove();        // 走訪中刪要用 Iterator.remove
}

走訪途中直接 li.remove(...) 會丟 ConcurrentModificationException

工具類

Collections 的靜態方法

Collections.sort(li);                 // 升冪
Collections.sort(li, Collections.reverseOrder()); // 降冪
Collections.max(li); Collections.min(li);
Collections.shuffle(li); Collections.reverse(li);
Collections.binarySearch(li, key);    // 須先排序!

Collections(複數、工具類)≠ Collection(單數、介面)。binarySearch 前要先 sort

Set

HashSet:自動去重

Set<String> tags = new HashSet<>();
tags.add("java");
tags.add("java");   // 重複加入無效,size 不變
tags.size();        // 1

HashSet 快、無序TreeSet 自動排序。add 重複回 false

Map 一

HashMap:鍵→值配對

"Amy"90 "Ben"85
Map<String,Integer> m = new HashMap<>();
m.put("Amy", 90);
m.put("Amy", 95);   // 鍵重複 → 覆蓋(不是新增)
m.get("Amy");       // 95
m.getOrDefault("Dan", 0);  // 不存在回 0

唯一HashMap 無序、TreeMap 依鍵排序。

Map 二

遍歷與字元計次

for (Map.Entry<String,Integer> e : m.entrySet())
    System.out.println(e.getKey() + " = " + e.getValue());

// 經典用途:計次
for (char c : s.toCharArray())
    count.put(c, count.getOrDefault(c, 0) + 1);

entrySet 同時拿鍵與值;計次用 getOrDefault(c, 0) + 1,別直接 get(會 null)。

收尾

三族一張表

List
有序·可重複·索引
get/set/size
Set
不重複·無索引
add/contains
Map
鍵→值·鍵唯一
put/get/entrySet

個數都用 size();只裝物件(靠自動裝箱)。

接下來

把集合練到自動

  • PDF 講義 完整內容+三族對照圖+ArrayList/LinkedList 結構圖
  • index List/Set/Map 互動對照+試跑
  • 本地練習 5 題 ArrayList/去重/計次/排序/Map 查找
  • 複習測驗 自測到 90%