上面一篇我们对Iterator进行了分析,接下来我们看看ListIterator。
ListIterator 继承自 Iterator 接口(关于Iterator的介绍 请点这里),在 Iterator 的基础上增加了 6 个方法,下面我们就来看看这几个新增的方法:
void add(E e)
将指定的元素插入列表,插入位置为迭代器当前位置之前(注意:是之前);boolean hasPrevious()
如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false;int nextIndex()
返回迭代器后边元素的索引位置, 初始为 0 ;Object previous()
返回列表中ListIterator指向位置前面的元素, 初始时为 -1;int previousIndex()
返回列表中ListIterator所需位置前面元素的索引;void set(E e)
从列表中将next()或previous()返回的最后一个元素更改为指定元素e,
注意:当没有迭代,也就是没有调用 next() 或者 previous() 直接调用 set 时会报 java.lang.IllegalStateException 错;
ListIterator 有两种获取方式:
List.listIterator()
List.listIterator(int location)
区别在于第二种可以指定游标的位置。
ListIterator用法:
ListIterator的强大之处在于其可以双向移动,还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,还可以使用set()方法替换它访问过的最后一个元素。不过ListIterator只能用于对各种List类的访问,可以通过调用List对象的listIterator()方法产生一个指向List开始索引处的ListIterator,还可以调用listIterator(int)方法产生一个指向List指定索引处的ListIterator.
下面我们来看看ListIterator的用法:
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
ListIterator<String> iterator = list.listIterator();
// 顺序输出iterator中的元素
while (iterator.hasNext()) {
System.out.print(iterator.next() + "");
}
// 给iterator添加两个元素
iterator.add("f");
iterator.add("g");
System.out.println();
System.out.println("-----------");
//通过使用ListIterator的特有方法hasPrevious与previous逆序遍历List的元素
//逆序输出
while (iterator.hasPrevious()) {
System.out.print(iterator.previous() + "");
}
System.out.println();
System.out.println("-----------");
// 从指定位置向前遍历
iterator = list.listIterator(2);
while (iterator.hasPrevious()) {
System.out.print(iterator.previous() + " ");
}
System.out.println();
System.out.println("-----------");
iterator = list.listIterator();
//通过使用ListIterator的set方法来替换iterator中的元素
while (iterator.hasNext()) {
String str = iterator.next();
iterator.set("替换元素:" + str);
}
iterator = list.listIterator();
//顺序输出迭代器中的元素
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
}
运行结果:
最后我们来看看ListIterator和Iterator的区别:
一.相同点
都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。
二.不同点
1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能实现修改。