前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中 for each循环的实现原理

Java中 for each循环的实现原理

作者头像
用户7886150
修改2021-04-21 14:25:23
1.4K0
修改2021-04-21 14:25:23
举报
文章被收录于专栏:bit哲学院

参考链接: Java for-each循环

一、foreach()简介 

1.for each语句是jdk1.5的新特征之一,在遍历集合,数组方面提供了很大的便利。 

2.for each语句是for语句的特殊简化版本,但是for each语句并不能完全取代for语句,然而,任何的for each语句都可以改写为for语句版本。  

3.for each的语句格式: 

  for(元素数据类型  元素变量:遍历对象) 

  { 

   //循环体内容 

  } 

二、实现原理 

平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterable接口(数组也是引用数据类型,所以它的底层也是一个类,同样实现了Iterable接口)。 

Iterable接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动。 

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

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

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

/** Implementing this interface allows an object to be the target of

 *  the "foreach" statement.

 * @since 1.5

 */

public interface Iterable<T> {

    /**

     * Returns an iterator over a set of elements of type T.

     * 

     * @return an Iterator.

     */

    Iterator<T> iterator();

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

package java.util;

public interface Iterator

{

    public abstract boolean hasNext();

    public abstract Object next();

    public abstract void remove();

实现Iterable,允许成为foreach语法的target。 

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

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

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

对于list编译器会调用Iterable接口的 iterator方法来循环遍历数组的元素,iterator方法中是调用Iterator接口的的 next()和hasNext()方法来做循环遍历。java中有一个叫做迭代器模式的设计模式,这个其实就是对迭代器模式的一个实现。对于数组,就是转化为对数组中的每一个元素的循环引用

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档