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

转载于:https://www.cnblogs.com/skyjava/articles/5040909.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值