0 0

Iterable接口与Iterator接口的困惑10

首先附上这两个接口JDK中的定义:
package java.lang;

import java.util.Iterator;

public interface Iterable<T> {
    Iterator<T> iterator();
}


package java.util;
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}
     可以看到这两个接口来自于不同的package中,实现Iterable接口可以使用foreach方法来遍历。
     但Iterable中只是用一个方法来返回一个Iterator类型实例,我就想:
     为什么一定要去实现Iterable这个接口呢?
     为什么不直接实现Iterator接口呢?
    
     难道这仅是语言规范,或者说是什么编程模式之类的?
2011年7月28日 17:16

6个答案 按时间排序 按投票排序

0 0

hxrs 写道
为什么一定要去实现Iterable这个接口呢?
为什么不直接实现Iterator接口呢?

难道这仅是语言规范,或者说是什么编程模式之类的?


看一下JDK中的集合类,比如List一族或者Set一族,
都是实现了Iterable接口,但并不直接实现Iterator接口。

仔细想一下这么做是有道理的。因为Iterator接口的核心方法next()或者hasNext()
是依赖于迭代器的当前迭代位置的。

如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。

但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。

2011年7月28日 17:16
0 0

Iterable是1.5引入的新特性,Iterator是1.2就有了,二者都是为了迭代造作,Iterable只是包装了Iterator,从而允许实现此接口的对象成为foreach语句的目标,而且这样的话,更方便以后的扩展。

2011年7月28日 17:16
0 0

Killer+bj 写道
Iterable是集合框架的超级接口!
(实现这个接口允许对象成为 "foreach" 语句的目标。 )而foreach是1.5以后的新特性吧!


事实上,Iterable 正是1.5开始引入的。

  package java.lang;

import java.util.Iterator;

/** 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();
}

2011年7月28日 17:16
0 0

Iterable是集合框架的超级接口!
(实现这个接口允许对象成为 "foreach" 语句的目标。 )而foreach是1.5以后的新特性吧!

2011年7月28日 17:16
0 0

思考一下remove的实现吧。
不是小心一点就会没有BUG的。

2011年7月28日 17:16
0 0

Iterable说白了就是为了可以for each。
另外记得java是强类型语言,一个类实现了Iterable,那么虚拟机就知道,你这个类可以用foreach来循环。

balabala,展开来可以讲一大堆。。。

2011年7月28日 17:16

相关推荐

    Java源码分析Iterable.pdf

    Iterable接口的定义位于java.lang.Iterable接口中,它只有一个方法,即iterator(),该方法返回一个Iterator对象,该对象用于迭代对象的元素。Iterable接口的定义如下所示: ```java public interface Iterable&lt;T&gt; {...

    详解Java中Iterable与Iterator用法

    深入探讨Iterable与Iterator关系时,我们会发现,为什么不直接将hasNext()、next()方法放在Iterable接口中,其他类直接实现就可以了?reason是有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个...

    Iterable和Iterator的关系

    在Java编程语言中,`Iterable`和`Iterator`是两个非常重要的接口,它们在处理集合数据时起到核心作用。理解这两个接口的关系对于高效地操作Java集合框架至关重要。 首先,我们来了解一下`Iterable`接口。`Iterable`...

    【JDK1.8源码剖析】内部迭代器 Iterable接口

    文章目录Iterable源码分析(一)简介(二...当然,一个类如果没有实现Iterable接口,也可以通过挂载外部迭代器Iterator进行遍历。 此外,内部迭代器还可转换为可分割迭代器Spliterator,以便用于流式操作 注意区别于外

    java集合_浅谈Iterable和Iterator的区别

    总结一下,`Iterator`是一个迭代器接口,专注于遍历集合元素,而`Iterable`是一个使类支持`for-each`循环的接口,它通过`Iterator`提供遍历功能。`Iterable`的实现比直接实现`Iterator`更灵活,更适合并发环境,并且...

    classclass

    关于学习过程中的随手笔记:自定义Iterable接口 定义一个可变参数 ... 可变参数注意点 1. 调用时可传可不传 2. 可变参数实际上就是一个数组 3. 可变参数位于形参列表的最后一个位置 */

    一个使用iterator和json技术的实例

    在Java编程语言中,`Iterator`接口和`Iterable`接口是处理集合数据的重要工具,而JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于数据传输和存储。这个"iterator_jsonDemo"实例结合了这...

    对Python中Iterator和Iterable的区别详解

    在Python编程语言中,Iterator(迭代器)和Iterable(可迭代对象)是两个非常核心的概念,它们是实现数据迭代操作的基础。理解这两个概念的区别对于掌握Python中的集合类型以及循环结构至关重要。 首先,我们来看...

    java 中 Iterator 与Iterable的作用

    java 中 Iterator 与Iterable的作用;java语言需要更多基础沉淀,扎扎实实,后面的各种项目都会如何天翼。进行更高阶的用法和一些框架的原理都离开最基础的东西,基础虽然枯燥,但是也很有乐趣。

    关于方法iterator()找不着的问题~~~~~

    如果你正在使用的类库版本不支持`iterator()`方法,比如你引用了一个旧版本的集合库,而这个版本并未实现`Iterable`接口,那么`iterator()`将不可用。确保你的项目依赖是最新的,并且与你的代码兼容。 2. **类型...

    mesh.js, 异步iterable迭代器的实用工具库.zip

    mesh.js, 异步iterable迭代器的实用工具库 Mesh是一个用于异步iterable迭代器的实用工具库。动机这个库最初是用来处理复杂的数据流,并统一应用程序在内部和外部的通信方式。 它还作为一个单一的单通道通道for所有...

    自己实现java中Iterator(迭代器功能).docx

    除了`Iterator`之外,还有一个相关的接口`Iterable`。这个接口主要用于定义一个可以被迭代的对象,它提供了一个`iterator()`方法,该方法返回一个迭代器对象。 ```java public interface Iterable&lt;T&gt; { Iterator...

    Java源码分析:深入探讨Iterator模式

    在Java中,集合框架通过实现`Iterable`接口并提供一个`iterator()`方法来支持迭代器模式。下面我们将深入探讨`java.util.AbstractList`类中如何实现迭代器模式。 #### 四、`java.util.AbstractList`中的迭代器实现 ...

    Iterator详解

    `iterator()`方法是`Iterable`接口的一个方法,由`Collection`接口继承。当你调用一个集合对象的`iterator()`方法时,它会返回一个实现了`Iterator`接口的对象,这个对象可以用来遍历集合中的元素。例如: ```java...

    Iterator Pattern(迭代模式)

    在Java中,迭代器模式的实现通常使用`Iterable`接口和`Iterator`接口。`Iterable`接口定义了一个`iterator()`方法,返回一个`Iterator`实例。`Iterator`接口则包含`hasNext()`和`next()`方法。 ```java public ...

    示例iterator使用及技巧

    在Java中,所有实现了`Iterable`接口的类(如`Collection`接口的所有实现类)都可以返回一个`Iterator`对象来遍历其内部的元素。 ##### 2. 获取`Iterator`实例 获取`Iterator`实例的方法非常简单,只需调用实现了`...

    Java容器类接口框架总览1

    Iterator接口定义了hasNext、next和remove方法,用于遍历和移除元素。fail-fast机制是Java集合框架的一个特性,当多个线程尝试修改同一集合时,如果一个线程在迭代过程中发现集合已被其他线程修改,将会抛出...

    java.util包

    2. Iterator和Iterable接口:Iterator用于遍历集合中的元素,而Iterable接口使得类可以被for-each循环遍历。这两个接口是Java集合框架的重要组成部分,提供了访问和操作集合元素的标准方式。 3. Map接口和其实现类...

    Java Iterator迭代器_动力节点Java学院整理

    Iterable接口则提供了一个iterator()方法,用于返回一个标准的Iterator实现。这个接口的实现者可以将其用于foreach语句中,例如Collection、Deque、List、Queue、Set等。 使用Iterator的简单例子可以展示它的使用...

Global site tag (gtag.js) - Google Analytics