Java 集合框架 (Collections Framework)
集合框架提供儲存和操作物件群組的資料結構和演算法。
集合框架階層
Collection(介面)
├── List(有序、可重複)
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
├── Set(無序、不可重複)
│ ├── HashSet
│ ├── LinkedHashSet
│ └── TreeSet
└── Queue(佇列)
├── LinkedList
├── PriorityQueue
└── Deque
└── ArrayDeque
Map(介面,鍵值對)
├── HashMap
├── LinkedHashMap
├── TreeMap
└── Hashtable
List
有序的集合,元素可以重複:
// ArrayList:基於陣列,隨機存取快
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
arrayList.get(0); // "Apple"
// LinkedList:基於鏈結,插入刪除快
List<String> linkedList = new LinkedList<>();
linkedList.add("Apple");
linkedList.addFirst("First");
詳細說明:ArrayList、LinkedList
Set
不重複的集合:
// HashSet:無序,基於雜湊
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Apple"); // 不會重複加入
System.out.println(hashSet.size()); // 1
// TreeSet:有序(自然排序)
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
// [1, 2, 3]
Map
鍵值對的集合:
// HashMap
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 100);
map.put("Banana", 50);
map.get("Apple"); // 100
// 遍歷
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Queue
佇列,先進先出 (FIFO):
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
queue.poll(); // "First"
queue.peek(); // "Second"(不移除)
集合比較
| 集合 | 特點 | 使用時機 |
|---|---|---|
| ArrayList | 隨機存取 O(1) | 頻繁讀取 |
| LinkedList | 插入刪除 O(1) | 頻繁增刪 |
| HashSet | 查找 O(1) | 快速去重 |
| TreeSet | 排序 | 需要排序 |
| HashMap | 存取 O(1) | 鍵值對存取 |
| TreeMap | 鍵排序 | 需要排序的 Map |
常用操作
建立集合
// Java 9+ 不可變集合
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("A", "B", "C");
Map<String, Integer> map = Map.of("A", 1, "B", 2);
// 可變集合
List<String> arrayList = new ArrayList<>(List.of("A", "B", "C"));
遍歷
List<String> list = Arrays.asList("A", "B", "C");
// for-each
for (String s : list) {
System.out.println(s);
}
// Iterator
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// forEach + Lambda
list.forEach(s -> System.out.println(s));
list.forEach(System.out::println);
排序
List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));
// 自然排序
Collections.sort(numbers);
// 自訂排序
Collections.sort(numbers, Collections.reverseOrder());
numbers.sort((a, b) -> b - a);
Collections 工具類別
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.reverse(list); // 反轉
Collections.shuffle(list); // 隨機打亂
Collections.sort(list); // 排序
Collections.max(list); // 最大值
Collections.min(list); // 最小值
Collections.frequency(list, 1); // 元素出現次數
詳細說明:Collections 類別
執行緒安全
// 建立執行緒安全的集合
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());
// 或使用 concurrent 套件
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<>();
集合方法總覽
| 方法 | 說明 |
|---|---|
add(e) | 加入元素 |
remove(e) | 移除元素 |
contains(e) | 是否包含 |
size() | 元素數量 |
isEmpty() | 是否為空 |
clear() | 清空集合 |
iterator() | 取得迭代器 |
toArray() | 轉為陣列 |