Java的Iterator和Collection实现类的关系

书上说:每一个Collection实现类都有一个iterator方法,返回一个Iterator接口的对象。问题来了:Iterator接口的对象指的是Iterator接口的... 书上说:每一个Collection实现类都有一个iterator方法,返回一个Iterator接口的对象。
问题来了:
Iterator接口的对象指的是Iterator接口的实现类对象,当Collection实现类调用iterator方法后,返回的Iterator对象跟Collection实现类有什么关系,怎么就能遍历该实现类了呢?
例如:Iterator it = HashSet.iterator();这里的it就能遍历HashSet了?
展开
 我来答
白眉鹰王天鹰教
推荐于2017-09-16 · 超过61用户采纳过TA的回答
知道小有建树答主
回答量:126
采纳率:0%
帮助的人:48.5万
展开全部
用Iterator模式实现遍历集合
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }

而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }

以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。

为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }

奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }

依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... }

在JDK1.5中,还对上面的代码在语法上作了简化(但是限于只读,如果需要remove,还是直接使用iterator):
// Type是具体的类型,如String。 for(Type t : c) { // 对t的操作... }

每一种集合类返回的Iterator具体类型可能不同,Array可能返回ArrayIterator,Set可能返回
SetIterator,Tree可能返回TreeIterator,但是它们都实现了Iterator接口,因此,客户端不关心到底是哪种
Iterator,它只需要获得这个Iterator接口即可,这就是面向对象的威力。

参考:
http://panxiaoxiao270557.blog.163.com/blog/static/137497445201351735734160/
千锋教育
2015-12-05 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
public interface Inteator {
boolean hasNext();
Object next(); 
}

public interface Iterable {
    Iterator iterator();
}

public interface Collection extends Iterable {
Iterator iterator();
}

public interface List extends Collection {
Iterator iterator();
}

public class ArrayList implements List {
public Iterator iterator() {
        return new Itr();
    }
    
    private class Itr implements Iterator {
     public boolean hasNext() {}
public Object next(){} 
    }
}


Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();  //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式