List的遍历方式:列表迭代器 ListIterator

316 阅读3分钟

ListIterator 介绍

List集合的遍历方式之一,继承自 Iterator ,所以 Iterator 有的方法 ListIterator 也有。
Iterator 只有remove方法提供删除功能(只能删除,不能添加)。
ListIterator 在Iterator的基础上,又提供了add方法进行添加数据(添加删除都有了)。

知识拓展:
Iterator 的内容看这里:https://juejin.cn/post/7217636750817443900


ListIterator 常用方法

boolean hasNext();
E next();
void add(E e);// 特有方法
void remove();

注意:
有两个特殊方法:
    * boolean hasPrevious();// 当前位置是否有元素
    * E previous();// 获取当前元素,并将指针移向前一个位置(和next方法的方向正好相反)
    

1.遍历顺序的不同:
    // 这两个是从前往后遍历
    boolean hasNext();
    E next();
    // 这两个是从后往前遍历
    boolean hasPrevious();
    E previous();
2.迭代器刚开始创建成功的时候,指针默认位置是在最前面,此时如果调用previous方法,指针就会向前移动一位,此时已经没有元素了。
3.next方法是将指针往后移,previous方法是将指针往前移。
4.什么情况下才能用previous方法遍历集合,只有指针移到了最后的位置,才能使用previous方法遍历,此时previous会一步一步将指针移回来。


ListIterator 遍历集合

List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");

ListIterator<String> listIterator = list.listIterator();// 获取列表迭代器对象,指针指向第一个位置
while (listIterator.hasNext()) {// 当前位置是否有元素
    String str = listIterator.next();// 获取当前位置上的元素,并将指针移向下一个位置
    System.out.println(str);
    // listIterator.add("ddd");// 添加(这里有细节,请看 ListIterator 方法细节)
    // listIterator.remove();// 移除当前位置上的元素
    // listIterator.set("ddd");// 修改
}
System.out.println(list);
// 打印结果:

ListIterator 方法细节

1.add方法
* 在next方法前面调用add方法:在当前位置插入元素,原来当前位置上的元素和指针整体向后移动一个位置。
* 在next方法后面调用add方法:在下一个位置插入元素,原来的下一个位置的元素和指针整体向后移动一个位置。

ListIterator MST

Q1:ListIterator怎么从前往后遍历?
A:从前往后遍历直接调用hasNext方法和next方法即可。
    * boolean hasNext();
    * E next();


Q2:ListIterator怎么从后往前遍历?
A:从后往前遍历需要调用hasPrevious方法和previous方法,功能和hasNext方法和next方法一样,不同的是他是从后往前遍历的。
    * boolean hasPrevious();
    * E previous();
    
Q2:列表迭代器和迭代器的区别?
A:迭代器提供了三个方法:
    * hasNext
    * next
    * remove // 删除(迭代器只能删除,不能添加)
  列表迭代器多提供了一个添加的方法:
    * hasNext
    * next
    * add // 列表迭代器独有的添加方法
    * remove

  迭代器遍历的时候只能删除,不能添加,没有提供添加的方法;
  列表迭代器遍历的时候,即能添加也能删除,提供了添加的方法;

ListIterator 源码

public interface ListIterator<E> extends Iterator<E> {
    /**
     * 当前位置是否有元素
     */
    boolean hasNext();

    /**
     * 获取当前位置的元素
     */
    E next();

    /**
     * 当前位置是否有元素(从后往前遍历)
     */
    boolean hasPrevious();

    /**
     * 获取当前位置的元素(从后往前遍历)
     */
    E previous();

    int nextIndex();

    int previousIndex();

    /**
     * 添加元素
     */
    void add(E e);

    /**
     * 删除元素
     */
    void remove();

    /**
     * 修改当前位置的元素,修改集合中的数据
     */
    void set(E e);

}