代碼片段:
Iterable<FileStore> stores = filesystem.getFileStores();
for (FileStore store : stores) {
System.out.println(store.name());
}
這是 Java 5 引入的**增強 for 循環 (for-each loop)**,冒號 `:` 讀作 **"in"**,語義為「遍歷 `stores` 集合中的每一個元素,賦值給 `store`」。
語法結構
for (元素類型 元素變量 : 可迭代對象/數組) {
// 循環體,元素變量為當前元素
}
- 冒號左側:聲明**循環變量**,類型需與集合元素類型兼容 (此處 `FileStore`)。
- 冒號右側:實現 `Iterable` 接口的對象、或**數組**。編譯器自動調用 `iterator()` 獲取迭代器。
等價的傳統寫法
Iterator<FileStore> it = stores.iterator();
while (it.hasNext()) {
FileStore store = it.next();
System.out.println(store.name());
}
適用範圍
- 所有實現 `java.lang.Iterable` 的集合:`List`、`Set`、`Queue` 等。
- 數組:`int[] arr = {1,2,3}; for (int x : arr) ...`
- 不適用:需索引操作、反向遍歷、修改集合結構 (刪除元素) 等場景。
注意事項
- 循環變量為**副本** (基本類型) 或**引用副本** (引用類型)。修改引用類型變量指向的對象內容有效,但重新賦值循環變量不影響集合原元素。
- 遍歷中**不可**直接調用 `stores.remove()`,會拋 `ConcurrentModificationException`。需用 `Iterator.remove()` 或收集後批量刪除。
- 性能與顯式迭代器基本一致,語法更簡潔。
參考資源
Java 增強 for 循環詳細解析