Iterator迭代器
Iterator模式是用于遍历集合类的标准访问方式.
Collection是集合类的基本接口,它的子接口有List,Set.其中List接口规定集合类元素具有可控制的顺序.Set接口规定集合类元素不能重复.
那么很明显,对于这种遍历,我们总是都事先知道集合的内部结构,访问代码和集合本身是紧密耦合的,无法将访问逻辑从集合类和客户端代码中分离出来.同时每一种集合对应一种遍历方法,客户端代码无法复用.那么当集合种类变多时,代码并不友好.而迭代器对不同集合类使用同样的逻辑来遍历集合,意思就是不用关注集合本身是怎样的,只需要控制iterator就好。
Iterator模式是用于遍历集合类的标准访问方式.
Collection是集合类的基本接口,它的子接口有List,Set.其中List接口规定集合类元素具有可控制的顺序.Set接口规定集合类元素不能重复.
Collection接口中定义了方法iterator(),集合类对象如果直接或间接的实现了Collection接口,必然都实现了方法iterator(),这个方法用来返回当前集合对象的一个iterator迭代器,用于对该集合中元素进行遍历.因此迭代器是依赖于某个集合而存在的,本身不能独立存在。
迭代器有三个重要的方法
下面一个图是这三个方法的工作模式(个人理解)
下面以常用的ArrayList对象为例:
List list = new ArrayList();
list.add("A");list.add("B");list.add("C");
Iterator iter = list.iterator(); //获取list的迭代器
while(iter.hasNext()){ //判断该集合中是否还存在元素
String s = (String) iter.next(); //返回迭代器的下一个元素
System.out.println(s);
}
其中需要注意的是remove()方法,remove()方法对next()方法具有依赖性,也就是说如果调用remove()方法之前没有调用next()方法是不合理的.如上面工作模式那个图,当最开始迭代器没有移动时,如果要删除元素A,就必须先使用next()方法越过元素A,然后remove()用来删除next()越过的对象。也就是说remove()删除的是next()返回的对象,如果事先没有用next()返回对象就调用remove()方法,会抛出异常.
说到这里,在简单说说迭代器遍历和普通遍历的区别:
如果是普通遍历,大部分会这样实现List list = new ArrayList();
list.add("A");list.add("B");list.add("C");
for(int i=0;i<list.size();i++ ){
String s = (String) list.get(i);
System.out.println(s);
}
那么很明显,对于这种遍历,我们总是都事先知道集合的内部结构,访问代码和集合本身是紧密耦合的,无法将访问逻辑从集合类和客户端代码中分离出来.同时每一种集合对应一种遍历方法,客户端代码无法复用.那么当集合种类变多时,代码并不友好.而迭代器对不同集合类使用同样的逻辑来遍历集合,意思就是不用关注集合本身是怎样的,只需要控制iterator就好。