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上找到。