✍🏼作者:周棋洛,bilidown开发者
♉星座:金牛座
🏠主页:我的个人网站
🌐关键:Java 增强for 工作机制

在这里插入图片描述

引言

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<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接口的集合类(如ArrayListHashSet等)都可以使用增强for循环。Iterable接口包含了一个iterator()方法,该方法返回一个实现java.util.Iterator接口的对象。Iterator接口中提供了hasNext()next()方法,用于遍历集合中的元素。

在这里插入图片描述

工作流程如下:

  1. 调用集合的iterator()方法获取迭代器对象。
  2. 调用迭代器的hasNext()方法检查是否有更多元素。
  3. 调用迭代器的next()方法获取下一个元素。

2.对于数组

数组没有实现Iterable接口,但增强for循环对数组也进行了支持。在编译阶段,增强for循环会被转换为基于索引的普通for循环。

工作流程如下:

  1. 初始化一个索引变量,从0开始。
  2. 每次循环时,检查索引是否小于数组的长度。
  3. 使用索引访问数组元素。

个人理解

在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);
     }
 }

在这里插入图片描述

就写到这里吧,下篇见。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐