Java之路:迭代器

泛型编程(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);
		}
	}
}

【结果】
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84946728