Java foreach的详细阐述
- 编程知识
- 2023-05-25
- 10
Java foreach语句是一种循环结构,它强制要求循环遍历一个数组或者一个集合。foreach依赖于迭代器(Iterator)来遍历集合或者数组,并且它对编码更加简洁明了。
一、foreach的基本语法
for (type variable : array) { statements using variable; }
type-表示数组元素的数据类型;variable-表示每个元素的变量名;array-表示要循环遍历的数组。
例如:
int[] numbers = {1, 2, 3, 4, 5}; for (int i : numbers) { System.out.println(i); }
输出结果:
1 2 3 4 5
二、foreach的优点
在使用foreach时,无需通过数组下标来获取数组元素,这样就避免了数组下标越界等问题。在循环过程中,foreach还会自动在集合上调用迭代器,便于集合线程安全地管理。
同时,使用foreach语句可以使代码更简洁、可读性更高,提高开发效率。
三、foreach与迭代器的使用
在集合类中,foreach循环会默认使用集合的迭代器方法。调用List集合中的迭代器方法代码如下:
import java.util.ArrayList; import java.util.List; public class ForeachDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); //创建一个String类型的List集合 list.add("Hello"); list.add("World"); list.add("Java"); for (String str : list) { //使用foreach语句循环遍历list集合 System.out.println(str); } } }
输出结果:
Hello World Java
四、foreach的局限性
foreach循环只能按照元素的顺序,依次对集合的每个元素进行访问。如果想要在遍历的过程中对集合进行增、删、改等操作,则会抛出ConcurrentModificationException异常。
五、foreach与多线程
在多线程环境中,使用foreach语句可能会导致线程不安全。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ForeachThreadDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); //创建一个String类型的List集合 list.add("Hello"); list.add("World"); list.add("Java"); //创建一个用于移除元素的线程 new Thread(() -> { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); if ("Java".equals(str)) { iterator.remove(); } } }).start(); for (String str : list) { //使用foreach语句循环遍历list集合 System.out.println(str); } } }
输出结果:
Hello World
可以看到,因为list集合正在被异步线程修改,所以输出结果中的“Java”已被移除。
六、foreach与Lambda表达式
在Java 8中,可以使用Lambda表达式来代替foreach循环,让代码更加简洁易读。Lambda表达式的基本语法如下:
list.forEach(str -> System.out.println(str));
以上代码相当于以下foreach循环:
for (String str : list) { System.out.println(str); }
可以看到,Lambda表达式可以在一行内完成代码编写,进一步提高了代码的可读性和简洁性。