✍🏼作者:周棋洛,bilidown开发者。
♉星座:金牛座
🏠主页:我的个人网站
🌐关键:Java
增强for
工作机制
目录
- 引言
- 增强for循环语法
- 增强for工作机制探究
- 简单总结
- 1.对于实现了Iterable接口的集合
- 2.对于数组
- 个人理解
- 彩蛋:forEach方法
引言
Java中的增强for循环(也称为for-each循环)是对集合(如数组,Iterable接口的实现类)进行遍历的一种简便方法。
在Java中,增强for循环是一种语法糖。本文简单探究一下它的底层工作机制。
增强for循环语法
增强for循环的语法如下:
for (ElementType element : collection) {// 使用element进行操作...
}
增强for工作机制探究
编写并编译如下测试代码,我们分别看看数组和集合的增强for循环编译后的字节码文件。
public static void main(String[] args) {// arr testString[] arr = {"a", "r", "r"};for (String str : arr) {System.out.print(str);}System.out.println();// list testList<String> list = Arrays.asList("l", "i", "s", "t");for (String str : list) {System.out.print(str);}
}
编译后字节码如下:
public static void main(String[] args) {String[] arr = new String[]{"a", "r", "r"};String[] var2 = arr;int var3 = arr.length;for(int var4 = 0; var4 < var3; ++var4) {String str = var2[var4];System.out.print(str);}System.out.println();List<String> list = Arrays.asList("l", "i", "s", "t");Iterator var7 = list.iterator();while(var7.hasNext()) {String str = (String)var7.next();System.out.print(str);}
}
可以发现:
- 如果是遍历数组,则增强for在编译时,会被转换为基础for循环。
String[] arr = {"a", "r", "r"};// 增强for循环
for (String str : arr) {System.out.print(str);
}// 等价标准索引循环
for (int i = 0; i < arr.length; i++) {String str = arr[i];System.out.println(str);
}
- 如果是遍历集合,则增强for在编译时,会被转换为标准迭代器循环。
List<String> list = Arrays.asList("l", "i", "s", "t");// 增强for循环
for (String item : list) {System.out.println(item);
}// 等价标准迭代器循环
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {String item = it.next();System.out.println(item);
}
简单总结
1.对于实现了Iterable接口的集合
所有实现了java.lang.Iterable
接口的集合类(如ArrayList
、HashSet
等)都可以使用增强for循环。Iterable接口包含了一个iterator()
方法,该方法返回一个实现java.util.Iterator
接口的对象。Iterator接口中提供了hasNext()
和next()
方法,用于遍历集合中的元素。
工作流程如下:
- 调用集合的
iterator()
方法获取迭代器对象。 - 调用迭代器的
hasNext()
方法检查是否有更多元素。 - 调用迭代器的
next()
方法获取下一个元素。
2.对于数组
数组没有实现Iterable
接口,但增强for循环对数组也进行了支持。在编译阶段,增强for循环会被转换为基于索引的普通for循环。
工作流程如下:
- 初始化一个索引变量,从0开始。
- 每次循环时,检查索引是否小于数组的长度。
- 使用索引访问数组元素。
个人理解
在Java中,增强for循环是一种语法糖,用于遍历数组或集合中的元素。它的底层实现依赖于迭代器机制(对于集合)或基于索引的循环(对于数组)。
在编译阶段,增强for循环会被转换为相应的标准循环结构。这个机制使得增强for循环既简洁又高效。
彩蛋:forEach方法
看下面的结构图,forEach
是java中Iterable
接口的一个默认方法,用于遍历集合(或实现了Iterable接口的类)中的每个元素,并对每个元素执行指定的操作。
forEach方法接受一个函数式接口作为参数,这个函数式接口通常是一个lambda表达式或方法引用,用于对集合中的每个元素执行操作。
这个方法是java8引入的,它提供了一种函数式,更简洁的遍历集合的方式。
虽然一些情况下,增强for和forEach方法可以互换使用,但它们在语法上和底层实现上是不同的。
语法上:增强for循环用于数组和集合的遍历,并且它是一种语言级别的循环结构。而forEach方法是集合类提供的一个方法,用于遍历集合,它是一个方法调用,需要传递一个函数式接口作为参数。
底层实现上:增强for循环在编译时会被转换为标准的迭代器或基于索引的循环,而forEach方法则是在集合类内部实现了对每个元素的遍历。
default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}
就写到这里吧,下篇见。