行业知识
Java | 增强for底层工作机制
✍作者:周棋洛,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 test String[] arr = {"a", "r", "r"}; for (String str : arr) { System.out.print(str); } System.out.println(); // list test List 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可以发现:
- 如果是遍历数组,则增强for在编译时,会被转换为基础for循环。
String[] arr = {"a", "r", "r"};// 增强for循环for (String str : arr) { System.out.print(str);}// 等价标准索引循环for (int i = 0; i- 如果是遍历集合,则增强for在编译时,会被转换为标准迭代器循环。
List list = Arrays.asList("l", "i", "s", "t");// 增强for循环for (String item : list) { System.out.println(item);}// 等价标准迭代器循环for (Iterator 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
- 如果是遍历集合,则增强for在编译时,会被转换为标准迭代器循环。
- 如果是遍历数组,则增强for在编译时,会被转换为基础for循环。
上一篇:备案号怎么获取?