Java 增强型 for 循环(Enhanced for Loop)详解
增强型 for
循环(也称为 "for-each" 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。
1. 基本语法
语法格式
java
for (类型 变量 : 迭代对象) {
// 循环体
}
类型
:迭代对象中元素的类型。变量
:每次迭代时,存储当前元素的变量。迭代对象
:数组或实现了Iterable
接口的集合(如List
、Set
等)。
2. 使用示例
2.1 遍历数组
java
public class EnhancedForArray {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num); // 输出:1, 2, 3, 4, 5
}
}
}
2.2 遍历集合
java
import java.util.ArrayList;
import java.util.List;
public class EnhancedForList {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
for (String fruit : fruits) {
System.out.println(fruit); // 输出:Apple, Banana, Cherry
}
}
}
3. 特性与限制
3.1 特性
-
简洁性:
- 不需要手动管理索引或迭代器,代码更易读。
- 对比传统
for
循环,不需要获取数组长度或调用集合的迭代器。
-
适用性广泛:
- 可用于数组、
List
、Set
、Map
(遍历entrySet()
、keySet()
或values()
)。
- 可用于数组、
3.2 限制
-
无法修改集合结构:
-
增强型
for
循环中,不能直接对集合进行add
或remove
操作,否则会抛出ConcurrentModificationException
。 -
示例:
javaList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); for (String s : list) { if (s.equals("A")) { list.remove(s); // 会抛出异常 } }
-
如果需要修改集合结构,可以使用 迭代器:
javaIterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String s = iterator.next(); if (s.equals("A")) { iterator.remove(); // 安全地删除元素 } }
-
-
无法访问索引:
-
增强型
for
循环中无法直接获取元素的索引。如果需要索引,需使用传统for
循环:javaString[] fruits = {"Apple", "Banana", "Cherry"}; for (int i = 0; i < fruits.length; i++) { System.out.println("Index " + i + ": " + fruits[i]); }
-
-
只支持顺序访问:
- 适用于
Iterable
接口的集合(如List
、Set
),不适用于需要随机访问的场景。
- 适用于
4. 遍历 Map
的增强型 for
4.1 遍历 keySet
遍历 Map
的所有键:
java
import java.util.HashMap;
import java.util.Map;
public class EnhancedForMap {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
}
}
4.2 遍历 entrySet
更高效地同时遍历键和值:
java
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
5. 适用场景
-
遍历数组:
- 对于大小已知且不需要修改的数组,增强型
for
是最佳选择。
- 对于大小已知且不需要修改的数组,增强型
-
遍历集合:
- 遍历
List
、Set
等集合,尤其是当集合不需要修改时。
- 遍历
-
遍历
Map
:- 使用
entrySet()
时,增强型for
简洁而高效。
- 使用
-
简化代码:
- 避免手动管理索引或迭代器。
6. 常见问题
6.1 为什么增强型 for
循环不能修改集合?
增强型 for
底层使用了 迭代器 来遍历集合,如果直接修改集合结构(如添加或删除元素),会导致迭代器失效,抛出 ConcurrentModificationException
。
6.2 如何在增强型 for
中访问索引?
可以在增强型 for
中手动维护索引:
java
String[] fruits = {"Apple", "Banana", "Cherry"};
int index = 0;
for (String fruit : fruits) {
System.out.println("Index " + index + ": " + fruit);
index++;
}
7. 底层实现
增强型 for
循环的本质是使用了 迭代器 来实现的。
伪代码
对于 Iterable
对象:
java
for (Type element : collection) {
Iterator<Type> it = collection.iterator();
while (it.hasNext()) {
Type element = it.next();
// 循环体
}
}
对于数组:
java
for (Type element : array) {
for (int i = 0; i < array.length; i++) {
Type element = array[i];
// 循环体
}
}
8. 总结
优点
- 简化代码:适合大多数迭代场景,避免手动处理索引和迭代器。
- 可读性高:语法简洁,专注于元素处理。
缺点
- 不能直接操作索引。
- 不支持修改集合结构。
- 适用于顺序访问,不适合随机访问场景。
增强型 for
循环是 Java 中对迭代器模式的进一步抽象,它让遍历变得更加简单、高效,是开发中非常常用的工具。