程序员老鬼

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表达式。
  • 搭配Stream API还能玩出很多骚操作。

缺点:无法中断遍历,比如跳出循环。


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

  1. 别装逼: 如果对新技术不熟,比如Stream,别硬整,经典for循环更靠谱。
  2. 代码可读性第一: 不要为了炫技写“天书”代码,面试官只会觉得你不适合团队协作。
  3. 多练多记: 光看不练,不如直接放弃集合遍历问题。

集合的遍历方法多,但别被这些“花里胡哨”的技巧吓倒。我们程序员追求的是工具为我所用,而不是我为工具所累。希望这篇文章能让你在面试中轻松拿捏集合问题,顺便逗笑面试官~😏

你还有啥遇到过的奇葩面试题?评论区见!

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

同时,也欢迎加入下方的交流群,一起研究deepseek的最新玩法

图片