关于Iterator接口和Iterable接口的有困惑的看过来~

所有的collection(list、Set)、Map都实现了Iterable接口,进而能够使用了Iterator()迭代器方法。首先搬源码

Iterable接口

public interface Iterable<T> {
    //定义了一个Iterator<T>迭代器类型的iterator()方法
    Iterator<T> iterator();
    
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
   
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}
Iterator接口
public interface Iterator<E> {
    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

一、为什么要采用Iterator迭代器?

http://www.cnblogs.com/ClassNotFoundException/p/7092041.html

如果没有迭代器,那么访问集合类的内部会显得非常的麻烦,表现在代码与集合类的紧密耦合上,且代码不具有好的复用性。

(想想在没有学习Iteartor的时候,是不是想要遍历集合中的元素,都要苦逼的手打for循环)

而Iterator迭代器采用了同一种逻辑来遍历集合for(Iterator it = c.iterater(); it.hasNext(); ) { ... } 所有的集合都可以使用这个方法。

二、为什么要实现Iterable接口?

http://wenda.so.com/q/1463366831725686?src=140

看到Iterable中封装了Iterator接口,所以只要实现了Iterable接口的类,就可以使用Iterator迭代器了。

三、Iterable接口和Iterator接口的区别?

http://wenda.so.com/q/1463366831725686?src=140

Iterator是迭代器,是一个接口。而Iterable是为了只要实现该接口就可以使用foreach,进行迭代。

Iterator中核心的方法next(),hasnext(),remove(),都是依赖当前位置,如果这些集合直接实现Iterator,则必须包括当前迭代位置的指针。当集合在方法间进行传递的时候,由于当前位置不可知,所以next()之后的值,也不可知。而当实现Iterable则不然,每次调用都返回一个从头开始的迭代器,各个迭代器之间互不影响。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值