今天java课老师讲了listiterator与iterator的关系,粗浅地学习了一下。
ListIterator是iterator的子接口
Listiterator可以应用于List及其子类,Iterator可以应用于Collection及其子类
前者实现双向遍历,后者实现单向遍历
关于各自有的方法:
ListIterator迭代器包含的方法有:
add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false
hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
remove():从列表中删除next()或previous()返回的最后一个元素(我的理解是调用next()或previous()方法后当前游标会指向之前的后一个或前一个元素,此时调用remove(),删除的也是他们的后一个或前一个元素)
set(E e):从列表中将next()或previous()返回的最后一个元素更改为指定元素e
Iterator迭代器包含的方法有:
hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false
next():返回集合中Iterator指向位置后面的元素
remove():删除集合中Iterator指向位置后面的元素(调用这个方法前必须确保至少调用过一次next(),并且调用过next()方法后只能调用一次remove()方法)
关于课后习题:
1.ArrayList为什么可以使用ListIterator?
答:ArrayList 继承了 AbstractList 这个抽象类,虽然AbstractList 类并未实现ListIterator接口,但是AbstractList 中定义了一个内部类 ListItr ,这个内部类实现了ListIterator接口及其所有的方法。
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
2.LinkedList为什么使用Iterator?
答:因为iterator可以应用于所有的集合,Set、List和Map以及这些集合的子类型。
3.iterator和ListIterator的区别
答:Iterator适用于Collection及其子类,即Set、List和Map以及这些集合的子类型,ListIterator仅适用于List及其子类;
Iterator单向遍历,Listiterator双向遍历;
ListIterator有add方法,可以向List中添加对象,而Iterator不能;
ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能;
二者都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改;
4.为什么ListIterator一开始不能从后往前遍历?
答:因为List Iterator一开始默认游标指向第一个值,要从后往前遍历必须指定游标的值。
如:ListIterator it = list.listIterator(list.size());
while(iterator.hasPrevious()){
it.previous();
}
有错误或者不到位的地方,欢迎指正,嘿嘿嘿