1.接口定义
1.1 Iterable
Iterable包含在java.lang中,使用时不需要import,其定义如下
1
2
3public 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
8public interface Iterator<Item>{ boolean hasnext(); #判断集合体是否到头 Item next(); #返回下一项的值 void remove(); #删除某项,本文不予讨论 }
Iterator看着就比Iterable正常多了,三个方法都很好理解。
2.接口实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import 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.接口方法调用
1
2
3
4
5
6ArrayStack<String> as = new ArrayStack<String>(); Iterator<String> i = as.iterator(); while(i.hasNext()){ String s = i.next(); StdOut.println(s); }
1Iterator<String> i = new ArrayIterator();
1
除了上面的标准写法,还有一种简练的foreach语句,也就是某些人说的增强for语句:
1
2
3for(String s: as){ StdOut.println(s); }
p.s. 可以,这很python
最后
以上就是坚强小猫咪最近收集整理的关于[java学习笔记]Iterator和Iterable接口1.接口定义3.接口方法调用的全部内容,更多相关[java学习笔记]Iterator和Iterable接口1内容请搜索靠谱客的其他文章。
发表评论 取消回复