• java foreach 循环原理


    java foreach 语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢?因为面试时被问到,所以在这边做一个记录。

    首先来看看foreach能够使用的类型是什么:

    编译器报错原因写的很清楚了,要求:数组或java.lang.Iterable。

    看下jdk源码对Iterable接口的声明:

     1 /** Implementing this interface allows an object to be the target of
     2  *  the "foreach" statement.
     3  * @since 1.5
     4  */
     5 public interface Iterable<T> {
     6 
     7     /**
     8      * Returns an iterator over a set of elements of type T.
     9      * 
    10      * @return an Iterator.
    11      */
    12     Iterator<T> iterator();
    13 }

    实现此接口,允许成为foreach语法的target。

    那数组呢?数组没有实现为什么也可以用呢?

    那是因为遍历数组时,会转换为对数组中的每一个元素的循环引用,相当于for语法循环遍历一样。

    那么为什么是数组或者实现了这个接口,就能实现遍历呢?其实是因为编译器的原因,在编译中的语义分析过程中,有一个解除语法糖的操作,(语法糖是啥?可以理解成编译器为方便开发人员开发,会对特定代码做一些特殊处理,方便开发人员使用,除了foreach,java中还有泛型、装箱、拆箱、变长字符串等)。

    • 对于list编译器会调用Iterable接口的 iterator方法来循环遍历数组的元素,iterator方法中是调用Iterator接口的的 next()和hasNext()方法来做循环遍历。java中有一个叫做迭代器模式的设计模式,这个其实就是对迭代器模式的一个实现。
    • 对于数组,就是转化为对数组中的每一个元素的循环引用
  • 相关阅读:
    Android牟利之道(四)如何推广你的产品,即你的APP
    android权限
    OpenGL 中文 API
    为何不能上网浏览网页 但是可以用QQ聊天
    安装任何软件都提示不能访问windows Installer服务
    初识WAP
    用asp.net 2.0实现网站二级域名(转)
    Visual Studio .NET已检测到指定的Web服务器运行的不是ASP.NET 1.1 版
    用EasyBoot轻松做启动光盘
    我心中的痛房子
  • 原文地址:https://www.cnblogs.com/bsjl/p/8628491.html
Copyright © 2020-2023  润新知