Iterator迭代器-ListIterator-Enumeration枚举类接口的特点和区别
1、Iterator的特点:
API中是这样解释的:
对collection进行迭代的迭代器。它取代了Enumeration.迭代器与枚举有两点不同:
A.迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素。
B.在方法名上得到了改进。
常用的方法有:
hasNext()如果仍有元素可以迭代,则返回true.
next()返回迭代的下一个元素。
remove()删除一个元素。
判断如果当前元素为abcd2,那么直接将它从列表中删除。
实例代码如下:说明在Iterator迭代过程中,对Iterator对象的操作,对list集合有影响。
迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
迭代器应用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
2、ListIterator的特点:
在API中是这样描述的,它的父类接口是Iterator,名称是系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator没有当前元素,它的光标位置始终位于调用previous()所返回的元素和调用next()所返回的元素之间。长度为n的列表的迭代器有n+1个可能的指针位置。
常用方法:
add(E e)将指定元素插入到某个元素的后面。
判断在abcd2后面插入元素abcd9,根据最后的list集合的结果就可以知道。
remove()效果跟Iterator一样。
hasNext()效果跟Iterator一样。
next()效果跟Iterator一样。
set(E e)修改成指定元素。
判断如果当前元素为abcd2,那么直接将abcd2修改成abcd9。
hasPrevious()反向判断是否还有前一元素。如果有返回true
previous()返回列表中的前一个元素。
特别注意,这个方法是建立在当前光标的前一个元素存在。否则将没有返回值。像下面如果把前一个while(it.hasNext)循环去掉,那么后一个while(it.hasPrevious())没有返回值,因为it的光标还在0角标位置。
previousIndex()返回对previous的后续调用所返回元素的索引。
nextIndex()返回对next的后续调用所返回元素的索引。
注意分析下面源代码:
package p3;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abcd1");
list.add("abcd2");
list.add("abcd3");
ListIterator it = list.listIterator();
while(it.hasNext()){System.out.println(it.next());}
System.out.println("********逆向遍历********");
while(it.hasPrevious()){
Object obj = it.previous();
System.out.println(obj);
if(obj.equals("abcd2")){
System.out.println("++++++++++++++");
System.out.println(it.previous());
System.out.println(it.nextIndex());
System.out.println(it.previousIndex());
System.out.println(it.next());
System.out.println("++++++++++++++");
}
}
}
}
运行效果:
解释1:为什么输出abcd1?
当前位置为abcd2,因为它调用previous()方法,所以返回当前位置之前的一个元素,那么就是abdc1,同时当前光标指定0。
解释2:为什么输出0?
由于当前光标指定为0,而nextIndex方法正是输出当前光标所在的角标值。并且调用这个方法,不会移动光标,所以当前光标还是0。
解释3:为什么输出-1?
由于当前光标是0,所以如果再调用previous()方法,返回值为-1,即不存在此位置,同时当前光标还是0。
解释4:为什么输出abcd1?
因为当前光标是在0,而next()方法正是输出当期光标所对应的元素值,所以是abcd1,同时光标向下移动,变成1,经过调用此方法后,当前光标为1。同时整个if()代码块执行结束。
解释5:为什么输出abcd1?
由于上面的if()代码块已经执行完毕,并且光标所在位置是1,而while循环的判断条件为it.hasPrevious(),当前光标之前是否还有元素,明显还有一个abcd1。所以就直接输出abcd1。并且当前光标变为0。
总结:只有调用next(),previous()两个方法时,光标才移动。
3、Enumeration的特点:
API中是这样描述的,它主要是何Vector结合配套使用。另外此接口的功能与Iterator接口的功能是重复的,此外,Iterator接口添加了一个可选的移除操作,并且使用较短的方法名。新的实现应该优先考虑使用Iterator接口而不是Enumeration接口。
常用方法:
hasMoreElements()判断集合中是否还有下一个元素。功能类似与Iterator接口当中的hasNext()。
nextElement()返回下一个元素。功能类似与Iterator接口当中的next()。