一个老问题 , 增强for循环的实现方式是什么

    public static void main(String[] args) {List<String> list = new ArrayList<>();//对集合 , 本质上是iterator迭代器list.add("A");list.add("B");list.add("C");for (String s : list) {System.out.println(s);}int[] intArr = {1, 2, 3};for (int val : intArr) {//对数组 , 就是用fori的常规方式实现System.out.println(val);}}

为了验证这个结果 . 我们将生成的.class文件进行反编译 . 则可以看到

    public static void main(String[] args) {List<String> list = new ArrayList();list.add("A");list.add("B");list.add("C");String s;for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) {s = (String) localIterator.next();System.out.println(s);}int[] intArr = {1, 2, 3};int val;for (int i = 0; i < intArr.length; i++) {val = intArr[i];System.out.println(val);}}

所以 , foreach在数组上还是使用了原来的fori循环 , 在其他对象上 , 实则是调用了itearator()方式使用迭代器的方式完成遍历 . 再来看如下代码 :

    String str = "";for (String s : str) {System.out.println(s);}

当然 , 敲完如上代码后编译器肯定会冒红报错 , 我们先不管这些 . 直接运行

可以看到 , foreach要求的对象必须是数组或Iterable . 我们再看一下Iterable这个接口的源码

/*** Implementing this interface allows an object to be the target of* the "for-each loop" statement. See* <strong>* <a href="{@docRoot}/../technotes/guides/language/foreach.html">For-each Loop</a>* </strong>** @param <T> the type of elements returned by the iterator** @since 1.5* @jls 14.14.2 The enhanced for statement*/
public interface Iterable<T> {
// 其他代码略...
}

这个接口里明确表明了 "实现该接口则允许对象成为'foreach'的目标" , 就是你实现这个接口之后 , 就可以使用foreach进行元素迭代 .

  • 对于list/map , 调用iterator方法
  • 对于数组  , 转为fori原生方式

java foreach 实现原理相关推荐

  1. java foreach 循环原理

    2019独角兽企业重金招聘Python工程师标准>>> java foreach 语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢? ...

  2. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  3. for-each 循环原理

    for-each 循环原理 1,for-each 是在java5 之后出现的.for是java 上的一个关键字,在jdk 找不到任何for的底层实现的.是因为for的底层实现被封装到了编译器中.所以通 ...

  4. java中迭代器的原理,java迭代器实现原理

    java迭代器实现原理 迭代器就是把一个集合类(如:List,ArrayList)里面的东西一次全取出来,按照原来的顺序排成一个队(比如在医院),然后你对它说"下一个"(.next)的时候,队头那个家 ...

  5. java lock的原理,Java中Lock原理探究

    在对于lock锁的使用上,很多人只是掌握了最基础的方法,但是对实现的过程不是很清楚.这里我们对lock锁功能的实现进行分析,以ReentrantLock为例,分析它的锁类型,并对相关的调用方法进行展示 ...

  6. Java并发编程原理与实战六:主线程等待子线程解决方案

    Java并发编程原理与实战六:主线程等待子线程解决方案 参考文章: (1)Java并发编程原理与实战六:主线程等待子线程解决方案 (2)https://www.cnblogs.com/pony1223 ...

  7. Java虚拟机工作原理详解

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...

  8. 10分钟看懂, Java NIO 底层原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 写在前面 ...

  9. java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...

    概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...

最新文章

  1. SRIO学习(一)——外设数据流
  2. [题解]洛谷P1119 灾后重建
  3. win下python环境搭建以及安装pip、django
  4. SICP学习笔记(1.1.4~1.1.5)
  5. [Redis6]key键操作
  6. python代码转换为pytorch_pytorch使用 to 进行类型转换方式
  7. python pdf转txt保留全部信息_Python 将pdf转换成txt(不处理图片)
  8. 超越培训班同学的独门绝技
  9. 安装其他插件svn消失
  10. c# asp.net 修改webconfig文件 配置
  11. Spark入门案例--出租车数据分析
  12. 二级mysql与access数据库_2017计算机二级Access数据库基础教程
  13. JAVA中解析XML和书写XML
  14. 广东四大姓氏,排名第三的是李姓,你的姓氏排名第几?
  15. 三极管工作原理_10分钟分析稳压三极管工作原理
  16. JavaSE StringBuffer StringBuilder 数组常见操作 Arrays 基本数据类型包装类
  17. 同比 数据模型 环比_同比(环比)在分析模型中的实现
  18. 网络拓扑绘制软件亿图图示安装以及使用攻略
  19. 杀毒软件需要开源吗?
  20. 清华AMiner团队推出AI订阅:实时追踪科研动态,定制个人科研信息流 | 专访唐杰教授团队

热门文章

  1. cool 软件 —— Carnac(实时桌面显示按键)
  2. DPDK Qos之报文处理流水线
  3. [CF353C]Find Maximum(贪心)
  4. 浅谈在过去的一年中,我所认识的前端开发---------
  5. C#中Split用法
  6. Vue首屏加载白屏问题及解决方案
  7. LeetCode--265. 粉刷房子Ⅱ(动态规划)
  8. 入门机器学习(二)--多变量线性回归
  9. R7-7 寻找大富翁 (25 分)
  10. R7-3 计算个人所得税 (10 分)