Java 中的遍历
创建一个名为 tags 的 ArrayList<String>,先添加 oak 再添加 pine,然后用 for (String t : tags) 遍历列表并打印每个词。编译 Lane.java 并运行 java Lane。屏幕应显示两行:oak,然后 pine。循环的每一轮打印一个值。遍历集合中的每个值,就是本页要教的内容。
每个值走一遍
在 HashSet 页,你不靠循环就检查 size 和 contains。在课程更早的 for-each 页,你遍历的是固定数组。本页用同样的 for-each 方式遍历 ArrayList,再展示用 get 的索引遍历。集合先用 add 变大。循环出现在值存好之后。
打开 Lane.java。保持公共类名为 Lane,以便与文件名一致。删除残留的 HashSet、contains、Bin、Desk 以及 map 的 put/get 演示。也删除任何 Scanner 或 nextLine。程序不得等待你输入。
靠近顶部、在 public class Lane 上方写:
import java.util.ArrayList;
在 main 里创建列表并添加两个词:
ArrayList<String> tags = new ArrayList<String>();
tags.add("oak");
tags.add("pine");
然后写 for-each 头和体:
for (String t : tags) { System.out.println(t); }
冒号位于元素类型与名称和集合之间。每一轮把 t 设为下一个词。第一份演示里不要写计数器。编译前先保存。
import java.util.ArrayList;
public class Lane {
public static void main(String[] args) {
ArrayList<String> tags = new ArrayList<String>();
tags.add("oak");
tags.add("pine");
for (String t : tags) {
System.out.println(t);
}
}
}
在存放 Lane.java 的文件夹里运行 javac Lane.java。当圆括号、花括号、尖括号、冒号和分号都匹配时,javac 自己不写任何一行。然后运行 java Lane——不是 java Lane.java,也不是 java ArrayList。运行命令里去掉 .java 后缀。
程序应打印两行后停下:oak,然后 pine。它不应要求你输入。若终端在等待键盘输入,说明某个旧练习里的 nextLine 调用仍留在文件中。删掉该调用,保留创建、两行 add 和 for-each。
把运行走一遍。Java 从 Lane.main 开始。列表里是 oak 再 pine。第一轮把 t 设为 oak 并打印 oak。第二轮把 t 设为 pine 并打印 pine。然后循环结束。不应再打印别的东西。若只看到 2,说明你打印了 size() 而不是在遍历值。若看到一行 [oak, pine],说明你打印了整个列表对象而不是每个元素——把 for-each 体保持为 println(t)。若看到 true 或 leaf,说明 Bin 或 Desk 演示仍在跑——改用 java Lane。
若 javac 说找不到 ArrayList,说明缺少 import,或它写在类行之后。把 import java.util.ArrayList; 移到 public class Lane 上方。若你写 for (String t : tags) 却不带花括号,之后又有多行体,本页把体保持为花括号里的一个 println,让形状更清楚。冒号后集合名的拼写必须与你创建的列表一致:tags,不是数组 for-each 页残留的 slots 名。
用 get 做索引遍历
第二份演示用带计数的 for 和 get 遍历同一列表。你在 for-each 路径旁看到槽位编号路径。
import java.util.ArrayList;
public class Lane {
public static void main(String[] args) {
ArrayList<String> tags = new ArrayList<String>();
tags.add("oak");
tags.add("pine");
for (int i = 0; i < tags.size(); i++) {
System.out.println(tags.get(i));
}
}
}
用同样方式编译并运行。屏幕再次显示 oak,然后 pine。头部从 i 为 0 开始,直到 i < tags.size()。每次体调用 tags.get(i) 读取一个槽位。这是 list-methods 页的 get 习惯放进循环。当你不需要在屏幕上看到索引号时,优先把 for-each 文件当作第一条教学路径。保留索引文件,以证明对本列表两种遍历打印相同的两行。若误把 i 从 1 开始,第一个打印的词会是 pine,oak 会被跳过——完整遍历请把 i 保持在 0。
不要依赖 HashSet 的打印顺序作为本页测验屏。集合不保证 oak 在 pine 之前。ArrayList 演示为你期望的两行保持稳定顺序。教学文件继续用 ArrayList,让测验屏可预测。
只有 size 不是遍历
第三个文件展示只打印计数的残留习惯。它在 HashSet 页有用,但不是 iterating。
import java.util.ArrayList;
public class Lane {
public static void main(String[] args) {
ArrayList<String> tags = new ArrayList<String>();
tags.add("oak");
tags.add("pine");
System.out.println(tags.size());
}
}
该文件打印 2——一个数字,不是那些词。只把它当作对照。遍历课保留的文件用 for-each 或索引 get 打印每个值。不要把仅 size 文件当作两行屏的测验路径提交。
与数组 for-each 以及 HashSet 检查对比
更早时,for-each 遍历 int[] 或 String[] 槽位。这里冒号仍然有效,但右边的名字是 ArrayList。在 HashSet 页,size 和 contains 不打印每个值也能回答。本页打印每个值。残留的 Bin contains 演示是另一课。对本页,保留带 for-each 的 Lane,它打印 oak 再 pine。
附近若还有旧的 Bin.java,若不造成你跑错类就留下,只有混淆时再删。编译本课的遍历文件后运行 java Lane。
留给 wrappers 的内容
本页遍历集合值。下一页讲包装类型,例如集合需要对象时,Integer 与原始 int 并排。这里继续用 ArrayList 上的 for-each 和索引 get。不要把 wrapper 演示当成这一页的硬性要求。
wrappers 之前
你可以导入 java.util.ArrayList,添加 oak 和 pine,并用 for (String t : tags) 打印每个词。你也可以用 for (int i = 0; i < tags.size(); i++) 和 tags.get(i) 遍历。编译 Lane.java 并运行 java Lane。屏幕显示 oak 再 pine。下一页是 wrappers,对象类型与原始类型并排放进集合存储。
保留 import。保留循环前的两次 add。保留 for-each 作为第一条教学遍历。这些习惯是继续前进前的检查点。当 for-each 之后两行都打印出来,iterating 就完成了本课任务,你可以进入下一主题。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部