Java - foreach 原理

简介: Java - foreach 原理


在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动。

Iterable 接口 API

packagejava.lang;
importjava.util.Iterator;
publicinterfaceIterable {
publicabstractIteratoriterator();
}

该接口中定义了产生Iterator迭代器的方法

packagejava.util;
publicinterfaceIterator {
publicabstractbooleanhasNext();
publicabstractObjectnext();
publicabstractvoidremove();
}

那么为什么实现了Iterable接口就支持foreach操作了呢?

我们写段foreach小程序看看字节码是怎么样的吧!

packagetest;
importjava.util.List;
publicclassTestForeach {
List<Integer>integers;
publicvoidtestForeach(){
for(Integeri : integers){
        }
    }
}

其中TestForeach方法的详细字节码如下

publicvoidtestForeach();
descriptor: ()Vflags: ACC_PUBLICCode:
stack=1, locals=3, args_size=10: aload_01: getfield#2// Field integers:Ljava/util/List;4: invokeinterface#3,  1// InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;9: astore_110: aload_111: invokeinterface#4,  1// InterfaceMethod java/util/Iterator.hasNext:()Z16: ifeq3219: aload_120: invokeinterface#5,  1// InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;25: checkcast#6// class java/lang/Integer28: astore_229: goto1032: returnLineNumberTable:
line11: 0line13: 29line14: 32LocalVariableTable:
StartLengthSlotNameSignature2902iLjava/lang/Integer;
0330thisLtest/TestForeach;
}

我们重点看红色部分,我来简单解释一下这段字节码的作用

0:加载this到操作栈

1:获取字段integers

4:调用integers的接口方法interator

9:将返回的迭代器赋给本地变量?(我们看到在最下面的本地变量区的Slot列,有0和2,但是没有1。事实上,1 就是编译器为我们生成的一个迭代器变量),这边就是给这个迭代器赋值

核心实现就是以上几行字节码,其余的部分就是和接下来的迭代器遍历有关了,有兴趣的朋友可以看看。

目录
相关文章
|
1月前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
1月前
|
Java
软件工程设计原理迪米特法则原则优缺点及JAVA代码举例
【4月更文挑战第8天】迪米特法则,也称为最少知识原则,是软件工程中一个旨在减少软件实体之间耦合关系的设计原则。它建议一个对象应该对其他对象有尽可能少的了解,并且只与直接的朋友通信。
40 10
|
1月前
|
存储 Java
软件工程设计原理单一职责原则 ,具体实现及JAVA代码举例
【4月更文挑战第6天】单一职责原则(Single Responsibility Principle, SRP)是面向对象设计原则之一,它指出一个类应该仅有一个变化的原因,即一个类应该只负责一项职责。这样做的目的是降低类的复杂性,提高系统的可维护性。
21 1
|
2天前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
|
3天前
|
搜索推荐 Java Shell
8大Java排序方法(由简入繁),有代码详解和原理指导
8大Java排序方法(由简入繁),有代码详解和原理指导
20 0
|
10天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
11天前
|
监控 搜索推荐 算法
Java排序:原理、实现与应用
【4月更文挑战第28天】本文探讨了Java中的排序算法,包括原理和实现。Java利用Comparator接口进行元素比较,通过Arrays和Collections类的sort方法对数组和列表进行排序。示例展示了使用这些方法的基本代码。此外,还讨论了冒泡排序算法和自定义排序场景,以适应不同需求。理解这些排序机制有助于提升程序效率。
13 1
|
12天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
32 2
|
12天前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
21 1
|
14天前
|
安全 Java 开发者
Java编程:深入探索其原理、特性与实战代码
Java编程:深入探索其原理、特性与实战代码
13 1