本文聚焦 Set 介面特性、Iterator 單向迭代器與 ListIterator 雙向迭代器的設計模式、方法差異與實戰程式碼。
equals() 判斷)。HashSet(雜湊表,O(1) 查找),元素需正確實作 hashCode() 與 equals()。| 實作 | 底層結構 | 順序 | 特點 |
|---|---|---|---|
| HashSet | HashMap | 無序 | 最快查找/新增/刪除 |
| LinkedHashSet | HashMap + 雙向鏈表 | 插入順序 | 兼具查找速度與順序 |
| TreeSet | 紅黑樹 | 自然排序/自訂 Comparator | 有序、範圍查詢、O(log n) |
Iterator 為設計模式,隱藏底層容器結構,提供統一存取方式。
iterator():容器回傳 Iterator,游標指向第一個元素前。hasNext():是否有下一個元素。next():取得下一個元素並移動游標。remove():移除**上次 next() 回傳**的元素(可選操作)。繼承 Iterator,僅適用於 List 實作,支援雙向移動與索引操作。
hasPrevious() / previous():反向遍歷。nextIndex() / previousIndex():取得下一個/上一個元素索引。set(E e):替換上次 next()/previous() 回傳的元素。add(E e):在游標位置插入元素(不移動游標)。import java.util.*;
public class ListTest {
public static void main(String[] args) {
Collection<Integer> col = new ArrayList<>(Arrays.asList(10, 20, 30));
List<Integer> list = new LinkedList<>();
list.addAll(col);
list.add(40); list.add(50); list.add(60); // [10,20,30,40,50,60]
displayIterator(list); // 遍歷並移除 50
list.remove(3); // 移除索引 3 (元素 40) -> [10,20,30,50,60]
displayListIterator(list);
}
// Iterator 單向遍歷 + 移除
static void displayIterator(Collection<Integer> list) {
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer val = it.next();
System.out.print(val + " ");
if (val == 50) it.remove(); // 安全移除
}
System.out.println(); // 輸出: 10 20 30 40 50 60 (50 被移除)
}
// ListIterator 雙向遍歷
static void displayListIterator(List<Integer> list) {
ListIterator<Integer> li = list.listIterator();
// 正向
while (li.hasNext()) {
System.out.print(li.next() + " ");
}
System.out.println(); // 輸出: 10 20 30 50 60
// 反向
while (li.hasPrevious()) {
System.out.print(li.previous() + " ");
}
System.out.println(); // 輸出: 60 50 30 20 10
}
}
ConcurrentModificationException。next(),且每次 next() 只能對應一次 remove()。Set 以唯一性與高效查找著稱;Iterator 統一了容器遍歷;ListIterator 為 List 提供強大的雙向游標與修改能力。實務上,優先使用增強 for 循環(內部用 Iterator),需雙向或修改時再直接用 ListIterator。