博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中 Iterable 和 Iterator 的区别
阅读量:5279 次
发布时间:2019-06-14

本文共 2288 字,大约阅读时间需要 7 分钟。

1、Iterable接口

Iterable接口 (java.lang.Iterable) 是Java集合的顶级接口之一。我们首先看下这这个接口在JDK中的定义:

package java.lang; public interface Iterable
{ Iterator
iterator(); }

 

(1)可见,Iterable接口中只包含一个方法,就是一个iterator()方法,用来返回一个Iterator类型的对象,或者说返回一个实现了Iterator接口的对象。

(2)实现了Iterable接口的类可以拥有增强的for循环,即只要实现了Iterable接口的类,就可以使用Iterator迭代器了。如

public static 
void print(Collection
coll){ for(AnyType item: coll) System.out.println(item);}

 

Tip:注意这里的函数输入参数Collection<AnyType> coll,其中coll是个接口变量。本来接口是不能用new来实例化一个接口的,即不能构造接口对象,但是可以用来声明接口变量,而且接口变量必须引用实现了接口的类对象。

(3)集合Collection、List、Set都是Iterable的实现类,所以他们及其他们的子类都可以使用foreach进行迭代。

2、Iterator接口

Iterator接口在JDK中的定义:

package java.util; public interface Iterator
{ boolean hasNext(); AnyType next(); void remove(); }

 

(1)当编译器见到一个正在用于Iterable对象的增强的for循环的时候,它用对iterator()方法的调用来代替增强的for循环以得到一个Iterator对象,然后调用next和hasNext。我们可以给出iterator()方法的定义

因此,上面Iterable例程可以改写为:

public static 
void print(Collection
coll){ Iterator
itr = coil.iterator(); while(itr.hasNext()) { AnyType item = itr.next(); System.out.println(item); } }

(2)Iterator接口中的核心方法next(),hasNext(),remove(),都是依赖当前位置。如果这些集合直接实现Iterator接口,则势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间进行传递的时候,由于当前迭代位置不可知,所以next()的结果也不可知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 而当实现Iterable则不然,每次调用都返回一个从头开始的迭代器,各个迭代器之间互不影响。

3、综合应用

我们后面会自己实现数据结构ArrayList,其中就用到了Iterable接口和Iterator接口,我们看下这个综合的例子

//  Obtains an Iterator object used to traverse the collection    public java.util.Iterator
iterator() { return new ArrayListIterator(); } /** * This is the implementation of the ArrayListIterator. * It maintains a notion of a current position and * the implicit reference to the MyArrayList. **/ private class ArrayListIterator implements java.util.Iterator
{ private int current = 0; private boolean okToRemove = false; public boolean hasNest() { return current

其中,iterator()方法就直接返回ArrayListIterator类的一个实例,该类是一个实现Iterator接口的类。

 

 

via: http://blog.csdn.net/lipengcn/article/details/51700153

 

转载于:https://www.cnblogs.com/whlshot/p/8000619.html

你可能感兴趣的文章
Linux中防火墙centos
查看>>
centos下同时启动多个tomcat
查看>>
Leetcode Balanced Binary Tree
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
css & input type & search icon
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
0320-学习进度条
查看>>
MetaWeblog API Test
查看>>
移动、尺寸改变
查看>>
c# 文件笔记
查看>>
类和结构
查看>>