通过源码认识 Iterable 和 Iterator 的区别
Iterator Iterable的区别
1.所属包不一样
java.util.Iterator since1.2
java.lang.Iterable since1.5
从发布时间就可以看出Iterable是补充Iterator的
2.我们要写一个集合,比如 ArrayList
源码类的签名是:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{...}
1 public interface List<E> extends Collection<E> {...} 2 public interface Collection<E> extends Iterable<E> {...}
一步一步分析才知道 接口Collection继承了接口Iterable.
而类Iterable中源码到底是啥呢?
1 public interface Iterable<T> { 2 Iterator<T> iterator(); 3 }
对,就这三行代码。
倒退一步,大家有没有想过直接实现接口 Iterator;
例如://为啥实现Iterator,大家应该知道吧,它里面定义了方法,如next(),hasNext()等
//我们在迭代时就可以用foreach,就像啥呢,拆炸弹有红黄线,规定一样
1 public class MyStack<Item>{ 2 Items[] items; 3 int N; 4 ... 5 //内部类 6 private class MyStackIterator implements Iterator<Item>{ 7 int i = N; 8 @Overide 9 public Item next(){ 10 return items[i--]; 11 } 12 @Overide 13 public boolean hasNext(){ 14 return i>0; 15 } 16 } 17 /**start*/ 18 public Iterator<Item> getIterator(){ 19 return new MyStackIterator(); 20 } 21 /**end*/ 22 }
那么问题来了,上面的代码完全忽略了 Iterable的存在,也可以实现功能。
那么,如果用到Iterable,上面的代码将会变成啥样呢?
public class MyStack<Item> implements Iterable<Item>{ Items[] items; int N; ... //内部类 private class MyStackIterator implements Iterator<Item>{ int i = N; @Overide public Item next(){ return items[i--]; } @Overide public boolean hasNext(){ return i>0; } } /**start*/ @Overide public Iterator<Item> iterator() { return new MyStackIterator(); } /**end*/ }
!!!结果出来了,差别就是注释/**start*/到/**end*/里面的内容。
总结,也就是说让集合实现Iterable就是让它知道,要实现一个方法返回Iterator对象。

浙公网安备 33010602011771号