泛型编程(Generic Programming)倡导用通用的方式进行编程。Java通过泛型机制实现了算法与数据类型的无关性以及容器(数据结构)与数据类型的无关性,但是泛型机制无法解决算法与容器的分离问题。为此,Java中引入了迭代器技术。
迭代器(Iterator)是一种抽象的设计概念,它提供了一种方法允许依序访问某个容器所含的各个元素,而无需暴露该容器的内部结构。迭代器又称迭代子,提供了对一个容器内对象的访问方法,并且定义了容器中对象的范围。
迭代器(Iterator)是一种设计模式,在Java中,它是一个对象,它的任务就是遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。迭代器通常被称为“轻量级”对象,因为创建它的代价很小。
1、单向迭代输出——Iterator
Iterator可以完成通过循环输出类集内容,从而获得或删除元素。Iterator是在进行集合输出的过程之中最为常见的一种输出接口,这个接口的定义如下:
public interface Iterator<E> {
public boolean hasNext();
public E next();
public void remove();
}
Iterator本身属于一个接口,如果要想取得这个接口的实例化对象,则必须依靠Collection接口中定义的一个方法。public Iterator<E> iterator()
。
在通过迭代方法访问类集之前,必须得到一个迭代方法。每一个Collection类都提供一个iterator( )方法,该方法返回一个对类集的迭代方法。通过使用这个迭代方法对象,可以一次一个地访问类集中的每一个元素。通常,使用迭代方法通过循环输出类集的内容,具体的操作步骤如下:
(1)通过调用类集的iterator( )方法获得对类集的迭代方法。
(2)建立一个调用hasNext( )方法的循环,只要hasNext( )返回true,就进行循环迭代。
(3)在循环内部,通过调用next( )方法来得到每一个元素。
package com.xy.test3;
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorDemo1 {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("Welcome");
al.add("to");
al.add("HAUT");
System.out.print("al的内容是:");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
}
}
【结果】
2、双向迭代输出——ListIterator
ListIterator扩展了Iterator,允许双向遍历列表,并且可以修改单元。对于执行List的类集,也可以通过调用ListIterator来获得迭代方法。列表迭代方法提供了前向或后向访问类集的能力,并且可以修改元素。
ListIterator接口说明的方法总结在下表中:
package com.xy.test3;
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorDemo1 {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("Welcome");
al.add("to");
al.add("HAUT");
System.out.print("al的内容是:");
ListIterator<String> litr = al.listIterator();
while(litr.hasNext()) {
Object element = litr.next();
// 用Set方法修改其内容
litr.set(element + "+");
} // 修改完后,迭代器位于列表尾部,只有在尾部,才能完成反向输出
System.out.println("将列表反向输出!");
while(litr.hasPrevious()) {
Object element = litr.previous();
System.out.println(element + " ");
}
System.out.println();
}
}
【结果】
3、废弃的枚举输出——Enumeration
如果按照历史来讲,Enumeration属于最古老的输出接口之一,在JDK 1.0时就已经提出了,并一直延续着使用了很长时间,直到今天还有许多的类只支持Enumeration输出。
Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。这个接口尽管没有被摈弃,但已经被Iterator所替代。
Enumeration对新程序来说是过时的。然而它仍被几种从以前版本遗留下来的类(例如Vector和Properties)所定义的方法使用,被几种其他的API类所使用,以及被目前广泛使用的应用程序所使用。
在JDK 1.5之后为Enumeration增加了泛型的定义,此接口定义如下:
public interface Enumeration <E>
{
}
public boolean hasMoreElements();
public E nextElement();
这个接口只是负责输出两个方法,作用如下:
(1)判断是否有下一个元素:public boolean hasMoreElements();
(2)取得下一个元素:public E nextElement()。
执行后,当仍有更多的元素可提取时,hasMoreElements( )方法一定返回true。当所有元素都被枚举了,则返回false。
nextElement( )方法将枚举中的下一个对象作为一个类属Object的引用而返回。也就是每次调用nextElement( )方法获得枚举中的下一个对象。
可是如果要想取得Enumeration接口对象并不是依靠Collection、List、Set这样的接口,只能够依靠Vector子类,在这个类中定义了一个方法。public Enumeration <E> elements()
package com.xy.test3;
import java.util.Enumeration;
import java.util.Vector;
public class EnumerationDemo1 {
public static void main(String[] args) {
Vector<String> v = new Vector<String>();
v.add("Hello");
v.add("world");
v.add("Java");
Enumeration<String> enu = v.elements();
while(enu.hasMoreElements()) {
String str = enu.nextElement();
System.out.println(str);
}
}
}
【结果】