java.util.Enumeration 是早期 Java 集合框架(JDK 1.0)定義的元素遍歷接口,雖已被 Iterator 取代,但在歷史代碼、Vector、Properties、StringTokenizer 等類中仍廣泛存在。本文解析其核心方法、典型用法及與 Iterator 的關鍵差異。
public interface Enumeration {
// 判斷是否還有下一個元素
boolean hasMoreElements();
// 返回下一個元素,無元素時拋出 NoSuchElementException
E nextElement();
}
| 方法 | 返回值 | 異常 | 說明 |
|---|---|---|---|
| hasMoreElements() | boolean | 無 | 檢查是否還有可遍歷元素,不移動指針 |
| nextElement() | E | NoSuchElementException | 返回當前元素並將指針後移 |
Vector 是少數仍保留 elements() 返回 Enumeration 的集合類:
import java.util.Vector;
import java.util.Enumeration;
public class EnumerationDemo {
public static void main(String[] args) {
Vector months = new Vector<>();
months.add("一月"); months.add("二月"); months.add("三月");
months.add("四月"); months.add("五月"); months.add("六月");
months.add("七月"); months.add("八月"); months.add("九月");
months.add("十月"); months.add("十一月"); months.add("十二月");
Enumeration em = months.elements();
while (em.hasMoreElements()) {
System.out.println(em.nextElement());
}
}
}
一月
二月
三月
...
十二月
| 維度 | Enumeration | Iterator |
|---|---|---|
| 引入版本 | JDK 1.0 | JDK 1.2 (Collections Framework) |
| 移除支持 | ❌ 無 remove() | ✅ 支持 remove() |
| 故障快速 | ❌ 不保證 | ✅ fail-fast 機制 |
| 方法命名 | hasMoreElements / nextElement | hasNext / next |
| 適用集合 | Vector, Properties, StringTokenizer, 早期 API | 所有 Collection 實現 |
| 線程安全 | Vector.elements() 返回的枚舉非線程安全 | 同樣非線程安全 |
for (String month : months) {
System.out.println(month);
}
Iterator it = months.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
months.stream().forEach(System.out::println);
// 或並行處理
months.parallelStream().forEach(System.out::println);
若需將 Enumeration 轉為現代集合:
// Enumeration → List
List list = Collections.list(months.elements());
// Enumeration → Iterator (Java 8+)
Iterator it = Collections.list(months.elements()).iterator();
Enumeration 是歷史產物,新代碼不建議直接使用hasMoreElements()/nextElement() 循環模式即可Vector 本身也不推薦新代碼使用,優先選 ArrayList + 顯式同步或 CopyOnWriteArrayList