增强for循环仅支持顺序只读遍历,无法修改原数组元素值、跳过/逆序/部分遍历、获取下标或同时操作多个数组。

增强 for 循环(也称 foreach)写起来简洁,读起来顺眼,但不是万能的。它在设计上就只做一件事:按顺序、只读地遍历整个数组或集合。一旦需求超出这个范围,就得换传统 for 循环或其他方式。
不能修改原数组元素值
增强 for 循环中拿到的是元素的副本,不是引用(基本类型)或可重新赋值的引用变量(对象数组中的引用本身)。所以直接给循环变量赋新值,不会影响原数组:
- int[] arr = {1, 2, 3};
for (int x : arr) { x = 0; } // 执行完 arr 还是 {1, 2, 3} - 对对象数组,可以调用对象方法修改其内部状态(比如 person.setName("A")),但不能让 person 指向另一个新对象(person = new Person() 不影响原数组)
无法跳过、逆序或部分遍历
它强制从头到尾、一个不落、正向走完所有元素:
- 想遍历下标 2 到 4 的子区间?不行,没索引,也没起始/结束控制
- 想倒着打印数组?不行,没有反向计数机制
- 想遇到某个值就提前退出?虽然可以用 break,但 continue 跳过当前轮次后仍继续后续元素——无法实现“跳过偶数位”这类基于位置的逻辑
不能同时操作多个数组
如果要对两个等长数组做逐位运算(比如求和、比较),增强 for 一次只能绑一个数组:
- int[] a = {1,2,3}, b = {10,20,30};
int[] c = new int[3];
for (int i = 0; i - 增强 for 写不出等效代码,因为无法在一次迭代中同步取 a[i] 和 b[i]
不适用于需要索引的场景
任何依赖下标的操作,它都无能为力:
- 构建新数组时需保留原位置信息(如“把偶数下标的元素放进新列表”)
- 判断是否为第一个或最后一个元素(没有 i == 0 或 i == arr.length-1)
- 根据相邻元素做计算(比如 arr[i] += arr[i-1])

















