Iterator与ListIterator
迭代器模式给容器的应用带来以下好处:
- 支持以不同的方式遍历一个容器角色。根据实现方式的不同,效果上会有差别。
- 简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
- 对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。
迭代器模式的适用范围:
- 访问一个容器对象的内容而无需暴露它的内部表示。
- 支持对容器对象的多种遍历。
- 为遍历不同的容器结构提供一个统一的接口(多态迭代)。
Iterator的最大威力:能够将遍历序列的操作与序列底层的结构分离。迭代器统一了对容器的访问方式。
Collection实现了Iterator接口,所以我们可以用Iterator来遍历多种集合类型。
Iterator接口中有三个方法:
1.hasNext():返回布尔值,查看是否有元素可以遍历
2.next():返回迭代的下一个元素
3.remove():删除用next()返回的最后一个元素,不能连续调用remove方法。只能next一次再remove一次。
使用了这三个方法的Demo:
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Iterator; 4 import java.util.List; 5 6 public class IteratorTest { 7 public static void main(String[] args) { 8 List<SuperClass> list = new ArrayList(Arrays.asList(new SuperClass(), new Class01(), 9 10 new Class02())); 11 Iterator<SuperClass> it = list.iterator(); 12 while(it.hasNext()){ 13 SuperClass s = it.next(); 14 System.out.println(s); 15 System.out.println("删除该元素"); 16 it.remove(); 17 18 } 19 System.out.println("\n"+list); 20 } 21 } 22 23 class SuperClass{}; 24 class Class01 extends SuperClass{} 25 class Class02 extends SuperClass{}
ListIterator
ListIterator是Iterator的子类接口,只能用于各种List类的访问。Iterator只能单向向前移动,但是ListIterator可以双向移动。
逆向访问
逆向访问用到的两个方法:hasPrevious()、previous()。
注:逆向访问时,初始化ListIterator实例时,要提供一个list.size()参数,这样才能总尾部开始迭代。
逆向访问的Demo:
1 List<String> list=new ArrayList<String>(); 2 list.add("first"); 3 list.add("second"); 4 list.add("third"); 5 ListIterator it=list.listIterator (list.size()); 6 while(it.hasPrevious()){ 7 System.out.println(it.previous()); 8 }