元数据卡
- 前置知识:第2章(变量与类型)、第4章(控制流——循环)、第6章前文(数组声明与创建)
- 预计时间:12 分钟
- 阅读模式:👣稳步推进
- 完成标志:能用标准 for 和增强 for(for-each)两种方式遍历数组;理解 for-each 的副本特性
遇到问题
你的 scores 街道建好了,5 间小房子排成一排,里面住着 85、92、78、95、88 这 5 个居民。现在你想挨家挨户拜访一遍,问问每个人住的是多少号。
你会怎么做?
最笨的办法:敲五次门,每家手动一次。
System.out.println(scores[0]); // 85
System.out.println(scores[1]); // 92
System.out.println(scores[2]); // 78
System.out.println(scores[3]); // 95
System.out.println(scores[4]); // 88如果街上有 1000 户呢?你得写到手断。
你需要一个自动化的方式:遍历(traverse / iterate)。
第二幕:挨家挨户拜访——遍历数组
最经典的方式——用 for 循环配合索引:
int[] scores = {85, 92, 78, 95, 88};
// 方式一:标准 for 循环,用索引
for (int i = 0; i < scores.length; i++) {
System.out.println("第 " + (i + 1) + " 个人的分数:" + scores[i]);
}语言:Java 预期输出:
第 1 个人的分数:85
第 2 个人的分数:92
第 3 个人的分数:78
第 4 个人的分数:95
第 5 个人的分数:88如何运行:写入 main 方法,先建数组再用循环 关键点:数组.length 是数组的属性(不是方法!没有 ()),它告诉你数组的长度 注意:i < scores.length 而不是 i <= scores.length——最后一个合法索引是 length - 1
增强 for 循环(for-each)
Java 5 之后有了更简洁的遍历方式:
int[] scores = {85, 92, 78, 95, 88};
// 方式二:增强 for 循环——不需要索引
for (int score : scores) {
System.out.println("分数:" + score);
}语言:Java 预期输出:
分数:85
分数:92
分数:78
分数:95
分数:88语法:for (元素类型 变量名 : 要遍历的数组/集合) { ... }什么时候用:只需要读、不需要知道元素位置的时候——代码更简洁 什么时候不用:需要知道当前是第几个、需要修改元素值——这时要用索引版
⚠️ 增强 for 的一个坑
如果你试图在循环里修改变量,它不会改变数组中对应的值。因为变量是元素值的副本,不是引用。修改副本,原件不变。
int[] scores = {85, 92, 78, 95, 88};
for (int score : scores) {
score += 5; // 自以为在给每个人的分数加 5
}
// 检查原数组——没变!
System.out.println(Arrays.toString(scores));
// [85, 92, 78, 95, 88]语言:Java,需要 import java.util.Arrays;为什么:score 是元素值的副本,修改它不会影响原数组
要想修改,必须用索引版:
for (int i = 0; i < scores.length; i++) {
scores[i] += 5; // 直接操作原数组的该位置
}差异窗口:C++/Python 的遍历
阿花在旁边说:"每种语言遍历的方式略有不同,但本质一样。"
C++:
#include <iostream>
int main() {
int scores[] = {85, 92, 78, 95, 88};
// C++17 的 range-based for
for (int score : scores) {
std::cout << score << std::endl;
}
// 或者用迭代器
for (auto it = std::begin(scores); it != std::end(scores); ++it) {
std::cout << *it << std::endl;
}
return 0;
}Python:
scores = [85, 92, 78, 95, 88]
# 最 Pythonic 的方式
for score in scores:
print(score)
# 如果需要索引
for i, score in enumerate(scores):
print(f"第 {i+1} 个:{score}")Python 的 enumerate 同时遍历索引和值——Java 没有内建的等价物,需要手动维护一个计数器或用外部库。
🧠 大脑缓存
| 遍历方式 | 什么时候用 |
|---|---|
for (int i = 0; i < arr.length; i++) | 需要知道索引、需要修改元素 |
for (int x : arr) | 只需要读值,不需要索引 |
arr.length是数组属性,不是方法(没有())- 增强 for 中的变量是副本,修改它不影响原数组
- 合法索引范围:
0到arr.length - 1
下一步
遍历只是基本功。现实中的数组操作要复杂得多——排序成绩、查找某个分数、把一条街区完整复制到另一条。下一节我们来玩真的。