1. 概述

在这个教程中,我们将讨论Java中的for-each循环,包括其语法、工作原理以及代码示例。最后,我们会理解它的优缺点。

2. 简单的for循环

Java中的基本for循环通常由三部分组成:初始化、布尔条件和步进:

for (initialization; boolean-condition; step) {
    statement;
}

它首先初始化一个循环变量,然后是布尔表达式。如果条件为true,它会执行循环内的语句,并递增或递减循环变量。否则,它会终止循环。

这种模式使得代码稍微复杂且难以阅读。此外,如果我们没有正确编写条件,就有可能陷入无限循环。

3. for-each循环

for-each循环是在Java 5中引入的。我们也称之为增强型for循环。

这是一种专门用于遍历数组或集合的另一种遍历方式。值得注意的是,它仍然使用for关键字。然而,我们不再使用循环计数器变量,而是分配与数组或集合相同类型的变量。

for-each名称的含义是,数组或集合中的每个元素都会被逐一遍历。

3.1. 语法

for-each循环由循环变量的声明开始,然后是一个冒号(:),后面紧跟着数组或集合的名称:

for (data_type var_name : array | collection) {
    // code
}

3.2. 工作原理

在每次迭代中,for-each循环将集合中的每个元素存储到循环变量中。因此,它会为数组或集合中的每个元素执行循环体内的代码。

最重要的是,遍历会持续到数组或集合的最后一个元素。

3.3. 示例

让我们通过一个例子来了解如何使用for-each循环遍历数组:

int numbers[] = { 1, 2, 3, 4, 5 };

for (int number : numbers) {
    System.out.print(number + " ");
}

这里,for-each循环逐个遍历数组numbers,直到结束。因此,无需使用索引访问数组元素。

现在,让我们看看使用for-each循环遍历各种集合的例子。

首先从一个List开始:

String[] wordsArray = { "Java ", "is ", "great!" };
List<String> wordsList = Arrays.asList(wordsArray);

for (String word : wordsList) {
    System.out.print(word + " ");
}

同样,我们也可以遍历Set的所有元素:

Set<String> wordsSet = new HashSet();
wordsSet.addAll(wordsList);

for (String word : wordsSet) {
    System.out.print(word + " ");
}

此外,我们还可以使用for-each循环遍历Map<K, V>

Map<Integer, String> map = new HashMap<>();
map.put(1, "Java");
map.put(2, "is");
map.put(3, "great!");

for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println(
      "number: " + entry.getKey() +
      " - " +
      "Word: " + entry.getValue());
}

以同样的方式,我们可以使用for-each循环遍历Java中的其他数据结构。

但如果数组或集合为null,它会抛出NullPointerException

int[] numbers = null;
for (int number : numbers) {
    System.out.print(number + " ");
}

上述代码会抛出NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at com.baeldung.core.controlstructures.loops.ForEachLoop.traverseArray(ForEachLoop.java:63)
    ..

因此,在传递给for-each循环之前,我们必须检查数组或集合是否为null

如果数组或集合为空,for-each循环将不会执行。

3.4. 优缺点

for-each循环是Java 5中引入的重要功能。但它也有其自身的优点和缺点。

for-each循环的优点包括:

  • 它帮助我们避免编程错误。
  • 使代码精确且易读。
  • 实现起来更简单。
  • 避免了无限循环的风险。

正因为这些优点,我们在处理数组或集合时,通常优先选择for-each循环。

它的缺点有:

  • 无法跳过元素,因为它逐个遍历。
  • 无法逆序遍历。
  • 如果使用for-each循环,不能修改数组。
  • 无法跟踪索引。
  • 相对于for循环,它有一些性能开销。

4. 总结

在这篇文章中,我们探讨了Java中的for-each循环,包括其语法、工作方式以及示例。最后,我们回顾了它的优缺点。

如往常一样,这些示例的代码可以在GitHub上找到。