java.util.ListIterator学习笔记

迭代器相关:

迭代器:

是一个对象,它的工作是遍历并且选择序列中的对象

好处:

能够将遍历序列的操作与序列底层的结构分离
(即不关心集合或集合内元素类型如LIst<Integer>)
Iterator只能顺序移动,listIterator可以双向移动
如果只是顺序遍历list并不要修改list对象本身(如删除)那么使用foreach更简洁

概述


继承结构


java.util.Iterator<E> << java.util.ListIterator

基本特性


列表迭代器并不持有当前元素的引用,其持有的游标是位于列表连个元素之间。可以通过调用next()或者previous()返回列表中的元素。一个拥有n个元素的列表拥有n+1个游标位置,示意图如下:

这里写图片描述

注意:remove和 set(Object)方法并不是以迭代器的游标为准,而是以最后一次调用迭代器的next()或者previous()方法的返回的元素为准。

基础方法


boolean hasNext();

当在迭代器正向遍历仍有可访问的有效元素时,则返回true,换句话说,如果调用next()方法可以返回一个有效元素时,则会返回true,否则返回false

E next();

返回迭代器正向访问时的下一个元素,并将迭代器游标进行自增操作。我们可以通过循环调用这个方法达到遍历列表中的目的。同时,我们也可以调用previous()方法来逆向遍历列表。当我们交替调用next()previous()时,迭代器将返回相同的元素。

boolean hasPrevious();

当迭代器逆向遍历仍有可以访问的有效元素时,则返回true。也就是说,当调用方法previous()仍然可以返回一个有效元素时,则返回true

E previous();

返回逆向遍历列表的下一个元素,并将迭代器的游标进行自减操作。

int nextIndex();

返回下一次调用next()时返回的元素的下标。当列表迭代器到达列表末尾时,则会回列表长度。

int previousIndex();

返回下一次掉调用previous()时返回的元素的下标。当列表迭代器到达列表头部时,则返回-1。

void remove();

删除最后一次调用next()或者previous()返回的元素。调用该方法有两个注意点:

  1. 每次调用next()previous()后,仅能调用一次本方法;
  2. 调用本方法前,不可调用add(E)方法;
void set(E e);

替换最后一次调用next()或者previous()返回的元素。在调用本方法前,不可调用add(E)remove()方法。

void add(E e);

在列表中插入一个新元素。如果next()可以访问有效元素,则将元素插入到调用next()方法返回的元素之前。即:如果previous()可以访问有效元素,则将元素插入到调用previous()方法返回的元素之后。当列表为空时,则插入的元素为列表中唯一的元素。新元素的插入位置为当前迭代器指定的游标之前,即:插入元素后,调用next()返回元素不受影响,而调用previous()函数,则会返回刚刚插入的新元素。调用这个方法后,会使调用nextIndex()previousIndex()的结构都增大1。插入元素前后的示意图如下:

这里写图片描述


这里写图片描述


E previous();举例:

public class E14_MiddleInsertion {
  public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<Integer>();
    ListIterator<Integer> it = list.listIterator();
    for(int i = 1; i <= 10; i++) {
      it.add(i);
      if(i % 2 == 0)
        it.previous();
    }
    System.out.println(list);
  }

}

第一次打印出1

第二次打印出1,2

并且执行it.previous();

游标由2的后面移动到1和2的中间

第三次就打印出了1,3,2以此类推。

猜你喜欢

转载自blog.csdn.net/xjk201/article/details/81051249