ListIterator是一个功能更加强大的迭代器接口, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
一、源码解析
public interface ListIterator<E> extends Iterator<E> {// Query Operations// 以正向遍历列表时,如果列表迭代器有多个元素,则返回trueboolean hasNext();// 返回列表中的下一个元素E next();// 如果以逆向遍历列表集合,列表迭代器有多个元素,则返回trueboolean hasPrevious();// 返回列表集合中前一个元素E previous();// 返回对next的后续调用所返回的元素的索引int nextIndex();// 返回对previous的后续调用所返回元素的索引int previousIndex();// Modification Operations// 从列表中移除由next或previous返回的最后一个元素void remove();// 用指定元素替换next或者previous返回的最后一个元素void set(E e);//将指定的元素插入列表void add(E e);
}
由以上源码内容可以看出可以ListIterator的特点:
(1)双向移动(向前/向后遍历).
(2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.
(3)可以使用set()方法替换它访问过的最后一个元素.
(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素.
二、ListIterator与Iterator的区别
一.相同点
都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
二.不同点
- 使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
- ListIterator有add方法,可以向List中添加对象,而Iterator不能。
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
- ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- 都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。