我是靠谱客的博主 坚强小猫咪,这篇文章主要介绍[java学习笔记]Iterator和Iterable接口1.接口定义3.接口方法调用,现在分享给大家,希望可以做个参考。

    Iterator和Iterable都是java的迭代器接口,二者既有区别又有联系,下面从接口定义,实现和方法调用三方面分析两接口的关系和使用方法。

1.接口定义

1.1 Iterable

    Iterable包含在java.lang中,使用时不需要import,其定义如下

复制代码
1
2
3
public interface Iterable<Item>{ Iterator<Item> iterator(); }

    可以看出Iterable接口提供了iterator方法(注意大小写,和Iterator接口不同),该方法返回的是一个Iterator接口。这里需要说明的是方法是可以返回接口的,但在实际调用该方法时,真正返回的是实现这一接口的某个类的实例(后面会有举例说明)。


1.2 Iterator

    既然Iterable返回的是Iterator接口,那我们就来看看Iterator的定义。与Iterable不同的是,Iterator是包含在java.util.Iterator类中,因此使用时需要先import下

复制代码
1
2
3
4
5
6
7
8
public interface Iterator<Item>{ boolean hasnext(); #判断集合体是否到头 Item next(); #返回下一项的值 void remove(); #删除某项,本文不予讨论 }

    Iterator看着就比Iterable正常多了,三个方法都很好理解。


2.接口实现

    下面以stack为例,解释如何在一个新的collection中实现这两个接口。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Iterator; public class ArrayStack<Item> implements Iterable<Item>{ private Item[] a = (Item[]) new Object[100]; private int N = 0; public void push(Item item){} public Item pop(){} public Iterator<Item> iterator(){ return new ArrayIterator(); } private class ArrayIterator implements Iterator<Item>{ private int i = 0; public boolean hasNext() {return i < N;} public Item next() {return a[i++];} public void remove() {} } }

    需要注意的是,stack实现的是Iterable接口,并通过Iterable中的iterator方法(还是注意区分大小写),返回一个ArrayIterator类的对象,而ArrayIterator正是实现了Iterator方法的一个类,这就是前面说的方法返回接口,实际上是返回了一个实现了该接口的类的实例。这里可能会有人问,为什么一定要先实现Iterable接口,而不直接实现Iterator接口呢,这样多写一个内部类不是很麻烦吗? 
      其实理解起来也很容易,在网上看到一段解释说的很明白:

     因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。 如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 但即使这样,Collection也只能同时存在一个当前迭代位置。 而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。 多个迭代器是互不干扰的。 

     出处:点击打开链接


3.接口方法调用

    Iterator调用的例子在网上就太多了,为了文章概念的完整性,这里仅列出最简单的两种调用。
复制代码
1
2
3
4
5
6
ArrayStack<String> as = new ArrayStack<String>(); Iterator<String> i = as.iterator(); while(i.hasNext()){ String s = i.next(); StdOut.println(s); }
上面是标准的调用Iterator进行遍历输出的例子,第二行代码可能会带来一些误解,看上去好像接口被实例化了,其实不然。我们知道接口是不能被实例化的,和上面方法返回接口类似,这里的“接口实例化”的其实是一个实现了这个接口的类的对象,换句话讲第二行等同于 
复制代码
1
Iterator<String> i = new ArrayIterator();
复制代码
1
    只不过ArrayIterator是一个内部的私有类,我们不能直接调用它,需要用iterator方法来完成这一过程。

    除了上面的标准写法,还有一种简练的foreach语句,也就是某些人说的增强for语句:

复制代码
1
2
3
for(String s: as){ StdOut.println(s); }

   p.s. 可以,这很python

最后

以上就是坚强小猫咪最近收集整理的关于[java学习笔记]Iterator和Iterable接口1.接口定义3.接口方法调用的全部内容,更多相关[java学习笔记]Iterator和Iterable接口1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部