Foreach与迭代器

Foreach语句可以用于数组和集合的遍历。之所以能够工作,是因为Java SE5引入了新的被称为Iterable的接口,该接口中包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动。因此如果你创建了任何实现Iterable的类,都可以将它用于foreach语句中。 ——Java编程思想第4版 第11章 243页

  1.任何实现了Iterable接口的类都可以用于foreach语句当中。

 1 //: holding/IterableClass.java
 2 // Anything Iterable works with foreach.
 3 import java.util.*;
 4
 5 public class IterableClass implements Iterable<String> {
 6   protected String[] words = ("And that is how " +
 7     "we know the Earth to be banana-shaped.").split(" ");
 8   public Iterator<String> iterator() {
 9     return new Iterator<String>() {
10       private int index = 0;
11       public boolean hasNext() {
12         return index < words.length;
13       }
14       public String next() { return words[index++]; }
15       public void remove() { // Not implemented
16         throw new UnsupportedOperationException();
17       }
18     };
19   }
20   public static void main(String[] args) {
21     for(String s : new IterableClass())
22       System.out.print(s + " ");
23   }
24 } /* Output:
25 And that is how we know the Earth to be banana-shaped.
26 *///:~

  2.foreach实现原理:foreach语句最终被编译器转换成对iterator.next()和iterator.hashNext()方法的调用,也就是对Iterator的另一种封装形式而已。只是作为使用者,jdk屏蔽了这些实现细节。我们甚至不知道Iterator的存在。看编译生成的字节码:

  Java代码:

 1 import java.util.*;
 2 public class Iterable_eros {
 3
 4     public static void main(String[] args) {
 5         List<String> strings = null;
 6         for(String s : strings){
 7         }
 8     }
 9
10 }

  Javap -c 生成的字节码:

 1 Compiled from "Iterable_eros.java"
 2 public class Iterable_eros {
 3   public Iterable_eros();
 4     Code:
 5        0: aload_0
 6        1: invokespecial #1                  // Method java/lang/Object."<init>":
 7 ()V
 8        4: return
 9
10   public static void main(java.lang.String[]);
11     Code:
12        0: aconst_null
13        1: astore_1
14        2: aload_1
15        3: invokeinterface #2,  1            // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
16        8: astore_2
17        9: aload_2
18       10: invokeinterface #3,  1            // InterfaceMethod java/util/Iterator.hasNext:()Z
19       15: ifeq          31
20       18: aload_2
21       19: invokeinterface #4,  1            // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
22       24: checkcast     #5                  // class java/lang/String
23       27: astore_3
24       28: goto          9
25       31: return
26 }
时间: 10-02

Foreach与迭代器的相关文章

Collection接口 Collection的通用方法 foreach Iterator 迭代器

Collection接口 单列集合的接口list 有索引 有序set 无索引 无序AbstractCollection是实现了Collection接口的抽象父类Collection<> c = new ArrayList<>();多态 只可以用父类的方法,不可以用子类特有的方法 Collection的通用方法增 add()删 remove()清空集合 clear()判断元素是否为空 isEmpty判断元素是否存在 contains()集合的长度 size() 增强for forea

嘿!@野兽,你的ng api 掉了 - - angular.forEach

@野兽的 ng api 学习 -- angular.forEach angular.forEach 调用迭代器函数取每一项目标的集合,它可以是一个对象或数组.迭代器函数与迭代器(value.key)一起调用,其中值是一个对象属性或数组元素的值,而数组元素是对象属性的关键或数组元素索引.为函数指定一个可选的上下文. 格式:angular.forEach(obj,iterator,[context]); obj:遍历的对象 iterator:迭代器 [content]: 对象为迭代器函数的上下文(t

php设计模式之迭代器模式

今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代.迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代. 在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口

C#基础—迭代器(Iterator)

1.引入迭代器 记得以前经常做到一些面试题,是关于要实现迭代器必须实现什么接口?其实,在C# 1.0里我们就经常用到foreach了,所以,只要支持foreach,那么这个类型就可以使用foreach 去遍历.那如何才能支持foreach 呢? 其实,答案都知道,要实现IEnumerable 或 IEnumerable<T>.IEnumerator 接口,因为foreach 需要迭代器的支持,而IEnumerable 接口中含有返回迭代器的 GetEnumerator 方法,对此,可以查看下M

【迭代器模式在.NET中的应用】

迭代器模式 定义参考 wiki: Iterator pattern 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据.   ------- 节选自 <大话设计模式>P207 我们可以将迭代器模式抽离出几个重要组成部分: 1. 迭代器抽象类 2. 聚集抽象类 3. 具体迭代器类 4. 具体聚集类 1. 迭代器抽象类 1 public interface IEnumerator 2 { 3 bool Mov

Angular - - angular.forEach、angular.extend

angular.forEach 调用迭代器函数取每一项目标的集合,它可以是一个对象或数组.迭代器函数与迭代器(value.key)一起调用,其中值是一个对象属性或数组元素的值,而数组元素是对象属性的关键或数组元素索引.为函数指定一个可选的上下文. 格式:angular.forEach(obj,iterator,[context]); obj:遍历的对象 iterator:迭代器 [content]: 对象为迭代器函数的上下文(this) 使用代码: var arr = [{ name: "A&q

R语言中的循环及其扩展:iter和foreach

R中有三种不同的循环结构: 1.repeat结构 它只是简单的重复同一个表达式:repeat expression,如果要跳出循环,可以使用break命令,若要跳至循环中的下一轮迭代,需要使用next命令:如果在循环中不包括break命令,R代码将会是一个无限循环. 因此,常用的结构如下: repeat { expression if(condition){ break } } 举例如下: #求 1 -100 的和i <- 1 sum_100 <- 0 repeat{sum_100 = sum

PHP设计模式漫谈之迭代器模式

原文出处:blogspot 今天<PHP设计模式漫谈>系列的主角是迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代.迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代. 在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口.只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或

java容器中遍历循环Iterator 和 Foreach 循环

最近遇到这样一个问题,要删除一个集合中的某个元素,该怎么解决? 我自己写了两段代码来删除,都报了一个错java.util.ConcurrentModificationException:为了让更多可能没注意到这个点的程序猿注意一下,我在这里分享下~ 先看代码 1 package com.zwt1234; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public cla