java foreach 循环原理

5人阅读 评论(0) 收藏 举报
分类:

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

首先来看看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();
}

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

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

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

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

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

查看评论

Java中foreach循环的实现原理

Java中foreach循环的实现原理 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/**...
  • qq_15071263
  • qq_15071263
  • 2017-07-02 10:57:39
  • 6591

Java基础(八)---集合框架中foreach循环的原理

Java集合框架分为两个接口:Collection接口和Map接口。 1.Collection接口中的foreach循环 首先,foreach循环是在Iterable接口中实现的,而Colle...
  • u014656992
  • u014656992
  • 2016-06-13 16:48:03
  • 1142

从头认识java-特辑-foreach在java里面两种实现原理总结

这一章节我们来讨论一下foreach在java里面两种实现原理总结。1.数组在数组里面,是固有的foreach实现,直接循环数组(1)代码清单package com.ray.test; public...
  • raylee2007
  • raylee2007
  • 2016-03-21 23:51:23
  • 4128

foreach原理

结构篇: foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下:...
  • T_Twory
  • T_Twory
  • 2016-07-28 15:44:42
  • 3854

js的for in循环和java里的foreach循环的区别

js里的for in循环定义如下:     for(var variable in obj) { ... }     obj可以是一个普通的js对象或者一个数组。如果obj是js对象,那么variab...
  • bruce128
  • bruce128
  • 2014-04-18 18:41:22
  • 6929

forEach实现原理

Java.util.List实现了java.lang.Iterable接口. jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一...
  • mrxiky
  • mrxiky
  • 2017-02-28 13:54:07
  • 1557

foreach 解析java二维数组

"/>  ${userArray[1][myindex]} userArray = { {1,2,3,4,5}, {''zhangsan'', 'li...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016-07-20 16:09:41
  • 986

java forEach实现原理

java.util.List实现了java.lang.Iterable接口. jdk api文档中是这样描述Iterable接口的:实现这个接口允许对象成为 "foreach" 语句的目标。不过咋一...
  • cq1982
  • cq1982
  • 2015-10-14 10:44:36
  • 2987
    个人资料
    等级:
    访问量: 28万+
    积分: 3985
    排名: 9860
    最新评论