基礎程式設計(Java)· CH16
List、Set、Map 一次到位 · 導覽地圖
完整內容看 PDF 講義,三族對照與試跑看 index。
為什麼要集合框架
全在 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 一
List<String> li = new ArrayList<>();
li.add("Amy"); li.get(0); li.size(); li.remove("Ben");
用介面型別 List 宣告;個數用 size()(方法、有括號)不是 length。
List 二
多數情況用 ArrayList;頻繁頭尾增刪才考慮 LinkedList。兩者 API(add/get/size)相同。
走訪
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.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
Set<String> tags = new HashSet<>();
tags.add("java");
tags.add("java"); // 重複加入無效,size 不變
tags.size(); // 1
HashSet 快、無序;TreeSet 自動排序。add 重複回 false。
Map 一
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)。
收尾
個數都用 size();只裝物件(靠自動裝箱)。
接下來