Iterator迭代器和Iterable的关系



写在前面                                                                                                                     


在“玩”集合的时候,常用集合的迭代器(Iterator),它很方便的能遍历集合中的所有的元素

Collection<String> list = new ArrayList<String>();
		list.add("aaaaaaaaa");
		list.add("bbbbbbbbb");
		list.add("cccccccc");
		for (Iterator<String> it = list.iterator(); it.hasNext();) {
			String str = it.next();
			System.out.println(str);
		}
		/* 或者 */
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			String s = it.next();
			System.out.println(s);
		}


也很容易知道Collection本身是实现的Iterable

package java.util;

public interface Collection<E> extends Iterable<E> {
 
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    ......
}

那么接口Iterable内部肯定有一个抽象方法

Iterator<T> iterator();
返回一个迭代器,那么该接口中还有什么方法呢????那些方法又分别有什么用呢????



接口Iterable的介绍                                                                                                      


带着疑惑我掀起了Iteratble接口的神秘面纱

package java.lang;
import java.util.Iterator;

public interface Iterable<T> {

    Iterator<T> iterator();
}

Iterable接口内部竟然真的就只有这么一个抽象方法,而且该方法也只是返回一个Iterator迭代器,那么问题来了



为什么很多类都实现Iterable而不是实现Iterator ??                                                                                              

既然Iterable内部只有一个方法来返回一个Iterator迭代器,到最后还是要用Iterator(迭代器)那么为什么不让Collection(或者其他需要迭代器的接口或类)去直接实现Iterator,反而要让其实现Iterable接口呢??????


在解决这个问题前,我们先来看一下Iterator的源代码


接口Iterator的介绍                                                                                                      


Iterator的源代码如下:

package java.util;

public interface Iterator<E> {
 
    boolean hasNext();

    E next();

    void remove();
}


Iterator内部的  next()方法和  hasNext()方法都依赖于当前迭代的位置


一次迭代后,“指向”或者说记录当前迭代位置的“指针”,会指向该集合的末尾


笔者认为                                                                                                                   


如果Collection实现的是Iterable的话


那么下一次再迭代的时候就需要另外写一个方法             将指针“移动到”集合的首部


即使是这样,该Collection内部也是只有一个迭代器,那么A的迭代仍然会影响B的迭代(多线程或者其他情况)


但是如果实现的是Iterable,然后在通过方法来调用迭代器的话,那么每次调用的时候产生的都是一个新的迭代器


迭代器之间互不干扰


这属于某种设计模式,但此处的重点不在设计模式上,就不做展开了,有兴趣的读者可以互相交流



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值