通过源码认识 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对象。

posted @ 2015-12-12 10:47  Rick2015  阅读(207)  评论(0编辑  收藏  举报