java.util.Enumeration<E> 是 JDK 1.0 時代引入的元素枚舉接口,用於順序訪問集合元素。雖然已被 Iterator 取代,但在舊版 API(如 Vector、Hashtable、Properties)中仍廣泛存在。
| 方法 | 返回值 | 說明 |
|---|---|---|
hasMoreElements() | boolean | 判斷是否還有下一個元素;有則返回 true,否則 false。 |
nextElement() | E | 返回下一個元素。若無元素則拋出 NoSuchElementException。 |
import java.util.Enumeration;
import java.util.Vector;
public class EnumerationDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");
vector.add("Cherry");
// 獲取枚舉器
Enumeration<String> enumeration = vector.elements();
// 遍歷
while (enumeration.hasMoreElements()) {
String fruit = enumeration.nextElement();
System.out.println("水果: " + fruit);
}
}
}
| 特性 | Enumeration | Iterator |
|---|---|---|
| 發布版本 | JDK 1.0 | JDK 1.2 (Collections Framework) |
| 移除支持 | 無 | remove() 可安全刪除底層元素 |
| 異常處理 | 無標準機制 | ConcurrentModificationException 快速失效 |
| 適用集合 | Vector, Hashtable, Properties 等舊類 | 所有 Collection 實現類 |
| 線程安全 | Vector/Hashtable 方法同步,但枚舉器本身不安全 | 取決於具體集合實現 |
hasMoreElements vs hasNext)。for (String fruit : vector) {
System.out.println(fruit);
}
Iterator<String> it = vector.iterator();
while (it.hasNext()) {
String fruit = it.next();
if ("Banana".equals(fruit)) {
it.remove(); // 安全移除
}
}
vector.stream()
.filter(f -> !"Banana".equals(f))
.forEach(System.out::println);
若必須處理返回 Enumeration 的舊 API(如 request.getParameterNames()、System.getProperties().propertyNames()),可轉為集合:
// 轉為 List List<String> list = Collections.list(enumeration); // 或轉為 Stream (Java 9+) Stream<String> stream = Collections.list(enumeration).stream();
Enumeration 是 Java 早期產物,新代碼禁止使用。維護舊系統時理解其行為即可;新項目統一使用 Iterator、增強 for 或 Stream API,享受類型安全、函數式操作與快速失效保護。