Java 中for循环和foreach循环哪个更快?
前言
在Java编程中,循环结构是程序员常用的控制流程,而for循环和foreach循环是其中比较常见的两种形式。关于它们哪一个更快的讨论一直存在。本文旨在探究Java中的for循环和foreach循环的性能差异,并帮助读者更好地选择适合自身需求的循环方式。通过详细比较它们的遍历效率、数据结构适用性和编译器优化等因素,我们将为大家揭示它们的差异和适用场景,以便您能够做出更明智的编程决策。
for循环与foreach循环的比较
小编认为for和foreach 之间唯一的实际区别是,对于可索引对象,我们无权访问索引。
for(int i = 0; i < mylist.length; i++) { if(i < 5) { //do something } else { //do other stuff } }
但是,我们可以使用 foreach 创建一个单独的索引 int 变量。例如:
int index = -1; for(int myint : mylist) { index++; if(index < 5) { //do something } else { //do other stuff } }
现在写一个简单的类,其中有 foreachTest() 方法,该方法使用 forEach 迭代列表。
import java.util.List; public class ForEachTest { List<Integer> intList; public void foreachTest(){ for(Integer i : intList){ } } }
编译这个类时,编译器会在内部将这段代码转换为迭代器实现。小编通过执行 javap -verbose IterateListTest 反编译代码。
public void foreachTest(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=3, args_size=1 0: aload_0 1: getfield #19 // Field intList:Ljava/util/List; 4: invokeinterface #21, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator; 9: astore_2 10: goto 23 13: aload_2 14: invokeinterface #27, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object; 19: checkcast #33 // class java/lang/Integer 22: astore_1 23: aload_2 24: invokeinterface #35, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 29: ifne 13 32: return LineNumberTable: line 9: 0 line 12: 32 LocalVariableTable: Start Length Slot Name Signature 0 33 0 this Lcom/greekykhs/springboot/ForEachTest; StackMapTable: number_of_entries = 2 frame_type = 255 /* full_frame */ offset_delta = 13 locals = [ class com/greekykhs/springboot/ForEachTest, top, class java/util/Iterator ] stack = [] frame_type = 9 /* same */
从上面的字节码我们可以看到:
a). getfield命令用于获取变量整数。
b).调用List.iterator获取迭代器实例
c).调用iterator.hasNext,如果返回true,则调用iterator.next方法。
下边来做一下性能测试。在 IterateListTest 的主要方法中,创建了一个列表并使用 for 和 forEach 循环对其进行迭代。
import java.util.ArrayList; import java.util.List; public class IterateListTest { public static void main(String[] args) { List<Integer> mylist = new ArrayList<>(); for (int i = 0; i < 1000000; i++) { mylist.add(i); } long forLoopStartTime = System.currentTimeMillis(); for (int i = 0; i < mylist.size(); i++) {mylist.get(i);} long forLoopTraversalCost =System.currentTimeMillis()-forLoopStartTime; System.out.println("for loop traversal cost for ArrayList= "+ forLoopTraversalCost); long forEachStartTime = System.currentTimeMillis(); for (Integer integer : mylist) {} long forEachTraversalCost =System.currentTimeMillis()-forEachStartTime; System.out.println("foreach traversal cost for ArrayList= "+ forEachTraversalCost); } }
结果如下:
总结
观察结果显示,for循环的性能优于for-each循环。然后再使用LinkedList比较它们的性能差异。对于 LinkedList 来说,for-each循环展现出更好的性能。ArrayList内部使用连续存储的数组,因此数据的检索时间复杂度为 O(1),通过索引可以直接访问数据。而 LinkedList 使用双向链表结构,当我们使用 for 循环进行遍历时,每次都需要从链表头节点开始,导致时间复杂度达到了 O(n*n),因此在这种情况下,for-each 循环更适合操作 LinkedList。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
探秘移动端BI:发展历程与应用前景解析
什么是移动端BI 维基百科 上对于 移动端商业智能的定义是这样的 > Mobile BI is a system that presents historical and real-time information on mobile devices for effective decision-making and management support. It enables analysis on smartphones and tablets, leading to increased firm performance. > 移动商业智能是一种在移动设备上展示历史和实时信息的系统,用于有效决策和管理支持。它可以在智能手机和平板电脑上进行分析,从而提高公司业绩 移动端上的数据分析 手机 + BI = 移动端BI ? 从呈现结果上来说是这样的,将数据可视化交互结果通过手机端显示即可。但移动端本身复杂的发展史又在提醒我们,事情未必如此简单。拿最基本的技术实现来说,移动端视图如何处理?(pc、mobile 和平板的呈现布局差异性巨大),移动端的网络请求是否要专门进行优化(一般...
- 下一篇
Web3.0时代的全新合作模式:DAO | 京东云技术团队
你有没有遇到这种情况:我有一个很棒的想法,想要开发出一个“改变世界”的项目,但是我既没有技术,也没有人脉,甚至没有资金,导致我始终没有办法开始行动,痛苦万分。就比如在黑客大赛上,我想到一个一定可以得奖的点子,但是却找不到合伙人,也无法独自完成,导致机会白白溜走。 今天我就介绍一个可以改变你这种现状的技术:DAO。但在介绍DAO之前我们需要先了解一下所有人都在热烈讨论的web3.0。 Web3.0 web2.0时代的最大特征就是“中心化”,由几个大公司为中心,向外来提供服务。比如我们所熟悉的谷歌提供的搜索服务,微信提供的社交服务,乃至我们的京东提供的购物服务。其实不仅限于互联网,现今的整个社会结构都与之相似:由银联为中心提供金融服务,保险公司为中心提供保险服务等等。 而我们即将进入的web3.0时代,最大的特征有几点:去中心化,基于区块链技术保障数据信息安全,AI技术。其中AI技术带来的服务我们大多数人已经都体验到了,而我今天介绍的DAO模式则是与去中心化和区块链技术紧密相关。 DAO简介 DAO的全称是Decentralized Autonomous Organization,中文译名...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Linux系统CentOS6、CentOS7手动修改IP地址
- Red5直播服务器,属于Java语言的直播服务器