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");

詳細說明:ArrayListLinkedList

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]

詳細說明:HashSetTreeSet

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());
}

詳細說明:HashMapTreeMap

Queue

佇列,先進先出 (FIFO):

Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
queue.poll();  // "First"
queue.peek();  // "Second"(不移除)

詳細說明:QueueDeque

集合比較

集合特點使用時機
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);

詳細說明:Comparable 和 Comparator

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()轉為陣列