java中的迭代器有三种
一、 Enumeration
它是用于获取早期遗留集合(Vector,Hashtable)元素的接口。Enumeration
是JDK 1.0中的第一个迭代器,其余的包含在JDK 1.2中,具有更多的功能。Enumeration
也用于指定 SequenceInputStream
的输入流。
我们可以通过在任何 Vector
对象上调用 elements()
方法来创建 Enumeration
对象
Enumeration
有两个方法:
下面演示下该迭代器的使用
输出:
Enumeration
的局限性:
Enumeration
仅用于遗留类(Vector,Hashtable), 因此,它不是一个通用的迭代器。- 在遍历的时候不能执行删除操作。
- 只有向前方向迭代。
二、 Iterator
Iterator
它是一个通用的迭代器,因为我们可以将它应用到任何Collection对象。通过使用 Iterator
,我们可以执行读取和删除操作。
当我们想遍历所有Collection框架中,实现了接口如Set,List,Queue,Deque以及Map接口的,所有实现类的元素时,都必须使用 Iterator
。Iterator
是唯一可用于整个集合框架的游标。
可以通过集合类的 iterator()
方法来创建:
Iterator
接口定义了三个方法:
remove()
方法可以抛出两个异常:
UnsupportedOperationException
—— 此迭代器不支持删除操作IllegalStateException
—— 如果next()
方法尚未被调用,或者在最后一次调用next()
方法之后,已经调用了remove()
方法
下面演示下这个迭代器的应用:
输出:
Iterator
的局限性:
- 在遍历的时候不支持替换和新增元素。
- 只有向前方向迭代。
三、 ListIterator
它仅适用于列表集合实现的类,如 arraylist,linkedlist
等。它提供双向迭代。
当我们要遍历列表元素时,必须使用 ListIterator
。它比 Iterator
有更多的功能(方法)。
ListIterator
对象可以通过调用列表接口中存在的 listIterator()
方法来创建。
ListIterator
集成自 Iterator
,所有具有 Iterator
所有的接口,并额外增加了6个接口
ListIterator
没有当前元素,它的光标位置总是位于通过调用 previous()
函数返回的元素和通过调用 next()
返回的元素之间。
set()
可以抛出4个异常:
UnsupportedOperationException
—— 不支持该设置操作ClassCastException
—— 指定元素的类阻止将其添加到此列表中IllegalArgumentException
—— 指定元素的某些方面阻止将其添加到此列表中IllegalStateException
—— 没有调用next()
或previous()
,或者在最后一次调用next()
或previous()
之后调用remove()
或add()
add()
可以抛出3个异常:
UnsupportedOperationException
—— 不支持该设置操作ClassCastException
—— 指定元素的类阻止将其添加到此列表中IllegalArgumentException
—— 指定元素的某些方面阻止将其添加到此列表中
下面演示下这个迭代器的应用:
输出:
ListIterator
的局限性:
它是最强大的迭代器,但它仅适用于List实现的类,因此它不是一个通用的迭代器。
四、 共同点
1、请注意,最初任何迭代器引用将指向一个集合中第一个元素的索引之前的索引。
2、我们不能创建 Enumeration
,Iterator
,ListIterator
的对象,因为它们是接口。我们使用像 elements()
,iterator()
,listIterator()
这样的方法来创建对象。这些方法具有匿名内部类,它们扩展了相应的接口并返回此类对象。如下代码所示:
输出:
引用类名称中的$符号是使用内部类的概念并创建这些类对象的证明。