为了账号安全,请及时绑定邮箱和手机立即绑定

Java的Iterator和Collection实现类的关系

Java的Iterator和Collection实现类的关系

凤凰求蛊 2019-02-18 12:12:28
Java的Iterator和Collection实现类的关系
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

用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接口即可,这就是面向对象的威力。



查看完整回答
反对 回复 2019-03-02
?
POPMUISE

TA贡献1765条经验 获得超5个赞



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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);

}


 


查看完整回答
反对 回复 2019-03-02
  • 2 回答
  • 0 关注
  • 841 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信