Java面试题:集合遍历的方法有哪些?
今天咱们聊个程序员永远绕不开的话题——Java集合的遍历方法。说到面试,集合相关的问题几乎是“老面孔”了,面试官们不厌其烦地问,我们就得不厌其烦地答。虽然这些问题看似简单,但其实蕴藏着很多门道,说不好还真能踩坑。
话不多说,直接上“菜”:Java集合的遍历方法有哪些?⚡
1. 最基本的——for循环
先来点“祖传操作”,没学过Java的人都能看懂的经典写法:
List<String> list = Arrays.asList("Java", "Python", "C++");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
优点:简单直观,能控制索引操作。
缺点:索引操作只适合List这种有序集合,像Set、Map这样的,索引用不上,直接歇菜。
2. 增强for循环(for-each)
“程序员懒人福音”登场。增强for循环让我们不用手动管理索引了,写起来优雅多了。
for (String language : list) {
System.out.println(language);
}
优点:代码更简洁,能适配所有实现Iterable接口的集合。
缺点:缺乏灵活性,比如无法访问当前元素的索引。
👀 段子时间:有次面试被问“增强for循环为什么优雅?”我答:“它能让我少敲几个键盘。”面试官笑了,但没给offer。👎
3. 迭代器(Iterator)
到了Iterator,总算有点“专业”味儿了。Iterator是Java中遍历集合的老工具了:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
优点:支持灵活的遍历,特别是在需要删除集合元素时,很方便(用iterator.remove())。
缺点:写起来略显繁琐,尤其对“懒癌”程序员不太友好。
⚠️ 注意:
用iterator遍历时,千万别对集合结构进行修改!否则分分钟抛出ConcurrentModificationException。
解决方案:用Iterator的remove方法安全删除元素。
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer num = iterator.next();
if (num % 2 == 0) { // 删除偶数
iterator.remove();
}
}
段子时间:我写过一个while循环,忘记加iterator.next(),结果进了死循环,公司服务器差点“炸”了。面试官:是你写代码把服务器搞崩的吧?
4. forEach方法(Java 8+)
Java 8引入的forEach简直是懒人福利,少敲代码,多吃饭。
list.forEach(language -> System.out.println(language));
或者更骚气的写法:
list.forEach(System.out::println);
优点:
简洁,直接上Lambda表达式。 搭配 StreamAPI还能玩出很多骚操作。
缺点:无法中断遍历,比如跳出循环。
5. Stream API(Java 8+)
Stream的流式操作带来了现代感,功能比传统遍历丰富得多。
list.stream()
.filter(language -> language.startsWith("J"))
.forEach(System.out::println);
💡 实战场景:过滤、映射、分组,Stream全都能搞定,面试官看到这段代码,估计会觉得你至少是“进阶程序员”。
优点:简洁、功能强大、支持并行处理(用parallelStream)。
缺点:可读性略差,Debug起来不太直观。
6. Enumeration(过时但还活着)
Enumeration是Vector、Hashtable这些老集合专属的遍历方法,面试时偶尔会被问到。虽然用得少,但学会应对“奇葩面试官”总是好的。
Vector<String> vector = new Vector<>(Arrays.asList("Java", "Python", "C++"));
Enumeration<String> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}
优点:几乎没了,历史遗留产物。
缺点:比Iterator还难用,用在新代码中会被笑话。👴
7. Map的特别遍历
Map的遍历稍微复杂点,因为它有键和值两部分内容,分为以下几种常见方式:
(1) 遍历键值对
Map<String, String> map = Map.of("Java", "Strong", "Python", "Dynamic");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
(2) 遍历键
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
(3) 遍历值
for (String value : map.values()) {
System.out.println(value);
}
(4) 使用forEach
map.forEach((key, value) -> System.out.println(key + ": " + value));
遍历方法的选择指南 🧭
如果集合小且逻辑简单:增强 for循环最合适。需要删除元素: Iterator更安全。处理复杂数据流:用 Stream来写“现代”代码。老代码中改动: Enumeration或Iterator更保险。
👀 面试官会比较看重你是否能根据场景选择合适的方法,而不是胡乱秀骚操作。
终极面试小tips
别装逼: 如果对新技术不熟,比如 Stream,别硬整,经典for循环更靠谱。代码可读性第一: 不要为了炫技写“天书”代码,面试官只会觉得你不适合团队协作。 多练多记: 光看不练,不如直接放弃集合遍历问题。
集合的遍历方法多,但别被这些“花里胡哨”的技巧吓倒。我们程序员追求的是工具为我所用,而不是我为工具所累。希望这篇文章能让你在面试中轻松拿捏集合问题,顺便逗笑面试官~😏
你还有啥遇到过的奇葩面试题?评论区见!
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
同时,也欢迎加入下方的交流群,一起研究deepseek的最新玩法