JAVA集合框架
Java集合框架——迭代器
1. 迭代器
前文中我们在集合框架Collection接口中提到了迭代器Iterator,但该方法并没有在AbstractCollection中得到实现,而是在具体的类中具体实现。本文主要阐述迭代器的更能和作用。
任何容器类,都必须有某种方式插入元素并将它们再次取回。对于List来讲,add()是插入元素的方法之一,get()是取出元素的方法之一。那么我们为什么用使用迭代器?因为从更高层的角度思考,迭代器可以帮助我们在重写代码的情况下就能将代码应用于不同的容器,换言之,迭代器统一了对容器的访问方式。迭代器就此应运而生了。
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关系该序列底层的结构。Java的迭代器只能单向移动,Iterator通常具有以下四个功能:
- 使用iterator()方法返回一个迭代器Iterator,该迭代器将准备好返回序列的第一个元素。
- 使用next()方法获得序列中的下一个元素。
- 使用hasNext()方法检查序列中是否还有元素。
使用remove()方法将迭代器最新返回的元素删除。
下面将给出迭代器使用的具体示范代码。
import java.util.*; public class test1{ public static void main(String[] args){ Set<String> set=new HashSet<String>();//创建规则集 set.add("China"); set.add("Japan"); set.add("Korea"); set.add("United States"); set.add("Britain"); Iterator<String> it=set.iterator();//创建规则集相应的迭代器 while(it.hasNext()){//遍历集合内的元素 System.out.println(it.next()+" "); } for(String Name:set)//for-each语句同样可以遍历集合 System.out.println(Name); } }
现在我们可以考虑一个新的方法display(),该方法依托于迭代器,遍历并输出集合内的元素。该方法可以不用知道确切的集合容器的类型,可以使规则集、线性表等等任意Collection容器,均可以实现集合元素的输出。具体实现如下所示,代码内所使用的的规则集同前文。
public class test1{ public static void main(String[] args){ TreeSet<String> treeset=new TreeSet<String>(set); LinkedList<String> linkedlist=new LinkedList<String>(set); display(set.iterator()); display(linkedlist.iterator()); display(treeset.iterator()); } public static void display(Iterator<E> it){ while(it.hasNext()){ E e=it.next(); System.out.println(e); } } }
这里我们所展示的display方法不包含任何有关它所遍历的序列的类型信息,这也展示了迭代器的最终目的,即能够将遍历序列的操作与序列底层的结构分离。
1.1 ListIterator
ListIterator是Iterator的子类型,它只能用于各种List类的访问。Iterator只能前向移动,但是ListIterator可以双向移动。并且还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的缩影,并且可以使用set()方法替换迭代器访问过的最后一个元素。我们可以通过调用listIterator()方法来产生一个指向List开始处的ListItertor,并且还可以通过调用listIterator(n)方法创建一个以阿卡似乎就指向索引为n的元素出的ListIterator。以下代码承接上文代码,对ListIterator做出演示。
public class test1{
public static void main(String[] args){
LinkedList<String> linkedlist=new LinkedList<String>(set);
ListIterator<String> linkIt=linkedlist.listIterator();
while(linkIt.hasNext()){
System.out.println(linkIt.next()+" "+linkIt.nextIndex()+" "linkIt.previousIndex());
}
}
}