java forEach实现原理

java forEach实现原理 博客分类: java
java.util.List实现了java.lang.Iterable接口.

jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一看Iterable接口并没啥特别之处,只是定义了一个迭代器而已。
[java] view plaincopy

    public interface Iterable<T> {  
      
        /** 
         * Returns an iterator over a set of elements of type T. 
         *  
         * @return an Iterator. 
         */  
        Iterator<T> iterator();  
    }  


究竟是如何实现foreach的呢,想想可能是编译器做了优化,就看了下最终编译成的字节码
[java] view plaincopy

    public class Iterable_eros {  
          
        List<String> strings;  
      
        public void display(){  
            for(String s : strings){  
                System.out.println(s);  
            }  
        }  
          
    }  

相应的字节码为
[java] view plaincopy

    public void display (){  
    line0    : aload_0    
               getfield  java.util.List my.lang.Iterable_eros.strings  
               invokeinterface  java.util.Iterator java.util.List.iterator() 1  
               astore_2    
               goto  line30  
    line13   : aload_2    
               invokeinterface  java.lang.Object java.util.Iterator.next() 1  
               checkcast  java.lang.String  
               astore_1    
    line23   : getstatic  java.io.PrintStream java.lang.System.out  
               aload_1    
    line27   : invokevirtual  void java.io.PrintStream.println(java.lang.String)  
    line30   : aload_2    
               invokeinterface  boolean java.util.Iterator.hasNext() 1  
               ifne  line13  
    line39   : return    

果然没猜错哈!可以看到,foreach语法最终被编译器转为了对Iterator.next()的调用。而作为使用者的我们, jdk并没用向我们暴露这些细节,我们甚至不需要知道Iterator的存在,认识到jdk的强大之处了吧。

为了证实自己的想法,用Iterator写了个遍历List的方法查看了字节码,果然跟foreach的形式基本一样,当然这是后话~
[java] view plaincopy

    public void display(){  
            for(String s : strings){  
                System.out.println(s);  
            }  
              
            Iterator<String> iterator = strings.iterator();  
            while(iterator.hasNext()){  
                String s = iterator.next();  
                System.out.println(s);  
            }  
        }  

[java] view plaincopy

    public void display (){  
    line0    : aload_0    
               getfield  java.util.List my.lang.Iterable_eros.strings  
               invokeinterface  java.util.Iterator java.util.List.iterator() 1  
               astore_2    
               goto  line30  
    line13   : aload_2    
               invokeinterface  java.lang.Object java.util.Iterator.next() 1  
               checkcast  java.lang.String  
               astore_1    
    line23   : getstatic  java.io.PrintStream java.lang.System.out  
               aload_1    
    line27   : invokevirtual  void java.io.PrintStream.println(java.lang.String)  
    line30   : aload_2    
               invokeinterface  boolean java.util.Iterator.hasNext() 1  
               ifne  line13  
               aload_0    
               getfield  java.util.List my.lang.Iterable_eros.strings  
               invokeinterface  java.util.Iterator java.util.List.iterator() 1  
               astore_1    
    line49   : goto  line69  
    line52   : aload_1    
               invokeinterface  java.lang.Object java.util.Iterator.next() 1  
               checkcast  java.lang.String  
               astore_2    
    line62   : getstatic  java.io.PrintStream java.lang.System.out  
               aload_2    
    line66   : invokevirtual  void java.io.PrintStream.println(java.lang.String)  
    line69   : aload_1    
               invokeinterface  boolean java.util.Iterator.hasNext() 1  
               ifne  line52  
    line78   : return

 

   为什么遍历arraylist的时候 for循环会比迭代器快呢
因为 arraylist 底层是由数组组成的,在java中为了通用迭代器,所以性能上有一定的损失
对于底层由数组组成的arraylist 这种对象,如果使用for循环,直接由索引获取对象,速度是很快的,使用迭代器要向下一个一个的遍历,速度是稍微一点点的慢过for

但是迭代器发光的地方并不在底层由数组构成的集合上,迭代器用在 底层由双向指针链表构成的linkedlist 上,效率大大高于for循环。
如 果使用for循环遍历 底层由双向指针链表构成的linkedlist的话,他会每次都从头遍历一次,知道获取你给定的下标,然后开始下一次遍历,。越往后速度越慢。下标越大, 速度越慢。但是对于迭代器,他不是根据下标完成的遍历,每取得一个对象后,他会根据这个对象的尾部指针取得下一个对象的内存位置,直接从内存位置取出内 容,这一点是for循环所不及的。

转载于:https://my.oschina.net/xiaominmin/blog/1597853

LE AUDIO---Volume Control Service 阅读详情

相关推荐

方差分析ANOVA、T检验、卡方检验的区别

T检验和ANOVA都是用来看样本之间均值是否相等,但是两者又有什么区别呢? 卡方检验是用来看分类变量之间有没有相关性。 自变量X类型 自变量X组数 因变量Y类型 分析方法 离散(类别) 仅仅2组 连续(均值) t检验 离散(类别) 2组及以上 连续(均值) ANOVA 离散(类别) 2组及以上 离散(类别) 卡方检验 进一步细分 方差分析 从理论上讲,方差分析有两个前提条件,一是因变量Y需要满足正态性要求,二是满足方差齐检验。 方差不齐时可使用‘非参数检验’,同时还可使用wel

itslifeng的博客 4万+

java forEach使用

java forEach使用 foreach 是 Java 中的一种语法糖,目的是方便程序员开发和提高性能。其实就是编译期间以特定的字节码或特定的方式来对这些语法进行处理。 1.普通数组forEach用法 对于数组,foreach 循环实际上还是用的普通的 for 循环,怎么说foreach 循环就是for 循环 int[] arr= {1,2,3,4,5} //forEach写法(效果跟下面同等...

qq_43203949的博客 4万+

汇川EASY系列之以太网通讯(套接字socket做从站)

汇川EASY系列的以太网通讯中的Socket字通讯,不能使用配置的方式实现,只能通过指令完成,本文将详细说明

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 2994

java中foreach的用法

java中foreach,可以认为是增强版的for语句循环,它可以减少代码量,但是不是所有的foreach都可以代替for循环。 foreach的语句格式:for(元素类型type 元素变量value :遍历对象obj){ 引用x的java语句 } 用法1:输出一维数组 用法2:输出二维数组 foreach的局限性 foreach是for循环的增强版本,简化了编程,提高了代码的可读性和安全...

qq_44840148的博客 10万+

Flutter蓝牙开发实战:flutter_blue_plus核心功能与实现原理剖析

本文深入剖析了Flutter蓝牙开发插件flutter_blue_plus的核心功能与实现原理。文章从源码解析入手,详细讲解了蓝牙状态管理、设备扫描、GATT连接、服务发现以及数据读写等关键流程的实现机制,并分享了实战中的性能调优与常见问题解决方案,帮助开发者高效构建跨平台蓝牙应用。

weixin_29014237的博客 443

应急响应靶场练习Linux-web-2

本次应急响应靶机采用的是知攻善防实验室的Linux-2应急响应靶机靶机下载地址为:相关账户密码: root/Inch@957821.(第一个为大写的i,记住要带最后的点.)1.该攻击者的IP为192.168.20.12.攻击方式应该是通过/index.php?user-app-register上传了一个webshell,然后使用蚁剑管理webshell之后再次上传version2.php进行提权.3.攻击者修改了phpmyadmin数据库的管理员密码。

tddkett的博客 2800

Java基础教程之 for-each循环

在普通的for循环中,我们可以通过索引来访问和操作集合或数组中的元素,但是在foreach循环中,我们无法直接获取当前元素的索引。首先,由于for-each底层使用迭代器进行循环遍历,就意味着在遍历过程中是无法修改集合或数组的长度的。它的设计旨在提供一种简洁、易读的语法,用于遍历集合或数组中的元素,从而减少了使用传统for循环时可能出现的冗余代码和错误机会。换言之,for-each是基于迭代器模式的一种改进版本,它使我们能够以简单直观的方式遍历集合或数组中的每个元素并对其执行相应操作。

mini_malism_的博客 8490

Python自动化生成HyperMesh Tcl命令流:从几何建模到有限元分析

本文详细介绍了如何利用Python自动化生成HyperMesh的Tcl命令流,实现从几何建模到有限元分析的全流程二次开发。通过封装常用操作函数,工程师可以高效完成参数化建模、自动网格划分及求解器文件输出,显著提升CAE前处理效率与标准化水平。

weixin_29041767的博客 423

JAVA8新特性--集合遍历之forEach

java中的集合有两种形式Collection&lt;E&gt;,Map&lt;K,V&gt; Collection类型集合 在JAVA7中遍历有一下几种方式: List&lt;String&gt; list = Arrays.asList("aaaa","bbbb"); //for循环 for (int i=0;i&lt; list.size();i++){ System....

凶猛的小蜜蜂 6万+

MOSFET雪崩特性参数解析

但是,一些电源在输出短路时,初级中会产生较大的电流,加上初级电感,器件就会有雪崩损坏的可能,因此在这样的应用条件下,就要考虑器件的雪崩能量。对于那些在MOSFET的D和S极产生较大电压的尖峰应用,就要考虑器件的雪崩能量,电压的尖峰所集中的能量主要由电感和电流所决定,因此对于反激的应用,MOSFET关断时会产生较大的电压尖峰。雪崩击穿能量标定了器件可以容忍的瞬时过冲电压的安全值,其依赖于雪崩击穿需要消散的能量。EAS单脉冲雪崩击穿能量, EAS标定了器件可以安全吸收反向雪崩击穿能量的高低。

Airer_00的博客 806

杰理AC695N系列芯片红外遥控按键使用教程

本文介绍了杰理AC695N芯片红外按键功能的配置和使用方法。主要内容包括:硬件连接说明(红外接收头接线至GPIO口)、软件配置(使能红外功能并设置接收引脚)、按键映射表修改(原始键值到逻辑按键的转换)以及按键扫描参数调整(消抖、长按时间等)。重点展示了三级映射机制,指导如何根据实际遥控器键值修改映射关系,实现不同模式下(蓝牙/音乐/FM)的自定义按键功能。最后提供了调试方法,可通过串口打印查看遥控器原始键值。

qq_42014563的博客 1463

【Java基础教程】(二十二)Java新特性篇 · 第二讲:foreach循环——概念及优缺点、使用方式及应用场景~

本文中,我们详细介绍了Java的 foreach特性,从它的起源、概念,到优缺点、特征和基础语法进行了全面讲解。我们还提供了丰富的代码案例来演示其使用技巧,并探讨了foreach的应用场景和注意事项。 通过合理地运用foreach特性,能够使代码更加简洁、易读,并且避免常见的错误。在日常开发中,我们建议熟练掌握foreach的用法,以便更高效地处理集合或数组的遍历操作。

Technology changes the world of life 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java foreach实现原理

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

陈德优的博客 235

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java foreach 源码_JAVA中foreach循环的实现原理

代码及其注释如下:/****/package com.M.controller.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/*** @author online zuozuo于2017年2月21日上午10:43:02编辑 本类用于解释Foreach循环的实现原理(javap)* @...

weixin_34975747的博客 572

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java foreach的实现_Java中foreach循环的实现原理

1、背景知识介绍java foreach 语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢?因为面试时被问到,所以在这边做一个记录。2 什么是foreach循环?For-each语法内部,对collection是用nested iteratoration来实现的,对数组是用下标遍历来实现。Java 5 及以上的编译器隐藏了基于iteration和下...

weixin_35735685的博客 668

foreach java 原理_foreach的实现原理

java.util.List实现了java.lang.Iterable接口.jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一看Iterable接口并没啥特别之处,只是定义了一个迭代器而已。publicinterfaceIterable{/***Returnsaniteratoroverasetofelemen...

weixin_39814925的博客 76

JAVA中foreach循环的实现原理

代码及其注释如下: /** * */ package com.M.controller.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @autho...

chizuanduo9634的博客 244

java 中foreach的实现原理

java foreach 语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢? 想要使用foreach语法必须是实现Iterable接口或数组 JDK源码中对Iterable接口的定义 实现此接口,允许对象成为for-each语法的声明 /** * Implementing this interface allows an object to be the target of * the "for-each loop" statement. See *

qq_34069839的博客 499

深究Java foreach循环的实现原理和其中的坑

集合、数组的遍历是必不可少的开发工具,foreach又是那么甜,二者走到一起会发生什么呢?这篇文章带你一起尝一尝其中的酸甜苦辣!

衷水木先生的博客 4429

java foreach的实现_java foreach实现原理

java.util.List实现了java.lang.Iterable接口.jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一看Iterable接口并没啥特别之处,只是定义了一个迭代器而已。publicinterfaceIterable{/***Returnsaniteratoroverasetofelem...

weixin_35679132的博客 233

Java FOREACH 实现原理 优点 以及 弊端

转自:https://www.cnblogs.com/slwenyi/p/6393366.html 通过反编译得出结论 在编译的时候编译器会自动将对for这个关键字的使用转化为对目标的迭代器的使用,这就是foreach循环的原理。进而,我们再得出两个结论: 1、ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,...

Hurricane_m的博客 1402

Java中foreach循环的实现原理

Java中foreach循环的实现原理 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/** * @author Created By 谭健:本类用于解释Foreach循环的实现原理 * * @about 新形式的遍历虽然好用,但是他丢掉了索引信息。当你需要访问数组或者

简简单单Onlinezuozuo 1万+
上一篇: ajax 加载 页面 执行 js
下一篇: PHP经典面试题目汇总(上篇)
weixin_33728708
博客等级 码龄11年 5472粉丝 1452原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值