增强for循环与普通for循环结合Random()使用时为何表现不同?
问题根源:增强for循环迭代的是元素值,而非索引
这问题其实是对Java增强for循环(foreach循环)的工作逻辑理解偏差导致的,咱们一步步拆解来搞清楚:
首先得明确一个核心差异:
- 普通
for循环里的i是数组的索引,你通过scores[i]直接定位到数组的某个位置进行操作; - 而增强
for循环里的score是数组的元素值,它只是把当前迭代到的元素值取出来给你用,并不是索引!
你的第一段代码执行过程详解
当你初始化int[] scores = new int[size];时,Java的int数组所有元素默认初始值都是0。进入增强for循环后:
- 第一次迭代:
score取的是scores[0]的值(也就是0),执行scores[score] = random.nextInt(size);→ 等价于scores[0] = 随机数,这时候第一个元素被修改; - 第二次到第十次迭代:
score依次取scores[1]到scores[9]的值——这些元素还都是初始的0!所以每一次执行的都是scores[0] = 新的随机数,相当于把第一个元素反复覆盖,而其他元素从头到尾都没被碰过,还是初始的0。这就是为什么你看到数组“几乎为空”——其他元素都是默认的0,看起来像没被修改,只有第一个元素是最后一次赋值的随机数。
普通for循环为什么正常
普通for循环里的i从0到9遍历的是数组的索引,每次执行scores[i] = random.nextInt(size);都是直接给数组的第i个位置赋值,所以每个元素都会被修改,最终得到10个随机数的数组,符合你的预期。
总结
增强for循环和普通for循环不是所有场景都能互相替代:
- 增强for循环适合只读遍历元素,或者不需要通过索引修改集合/数组的场景;
- 如果需要通过索引定位并修改数组元素(比如你的赋值场景),必须使用普通for循环,或者对于集合来说可以用带索引的迭代方式。
内容的提问来源于stack exchange,提问作者brosefzai
相关产品推荐
相关产品推荐

